@likec4/mcp 1.48.0 → 1.50.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.
Files changed (34) hide show
  1. package/README.md +11 -1
  2. package/dist/THIRD-PARTY-LICENSES.md +2413 -0
  3. package/dist/_chunks/libs/@chevrotain/cst-dts-gen.mjs +30 -0
  4. package/dist/_chunks/libs/@hono/mcp.mjs +34 -0
  5. package/dist/_chunks/libs/@mantine/colors-generator.mjs +2 -2
  6. package/dist/_chunks/libs/@modelcontextprotocol/sdk.mjs +7 -36
  7. package/dist/_chunks/libs/@radix-ui/colors.mjs +1 -0
  8. package/dist/_chunks/libs/@smithy/is-array-buffer.mjs +1 -0
  9. package/dist/_chunks/libs/chevrotain-allstar.mjs +2 -2
  10. package/dist/_chunks/libs/chevrotain.mjs +35 -35
  11. package/dist/_chunks/libs/citty.mjs +1 -1
  12. package/dist/_chunks/libs/is-error-instance.mjs +1 -1
  13. package/dist/_chunks/libs/isexe.mjs +1 -0
  14. package/dist/_chunks/libs/khroma.mjs +1 -1
  15. package/dist/_chunks/libs/langium.mjs +18 -17
  16. package/dist/_chunks/libs/mdast-util-from-markdown.mjs +2 -2
  17. package/dist/_chunks/libs/mdast-util-gfm.mjs +9 -9
  18. package/dist/_chunks/libs/mdast-util-to-hast.mjs +7 -7
  19. package/dist/_chunks/libs/merge-error-cause.mjs +2 -2
  20. package/dist/_chunks/libs/micromark-extension-gfm.mjs +1 -1
  21. package/dist/_chunks/libs/mnemonist.mjs +1 -1
  22. package/dist/_chunks/libs/nano-spawn.mjs +3 -0
  23. package/dist/_chunks/libs/p-limit.mjs +1 -1
  24. package/dist/_chunks/libs/remeda.mjs +2 -1
  25. package/dist/_chunks/libs/safe-stringify.mjs +1 -1
  26. package/dist/_chunks/libs/ufo.mjs +1 -1
  27. package/dist/_chunks/libs/unified.mjs +1 -1
  28. package/dist/_chunks/libs/which.mjs +1 -0
  29. package/dist/_chunks/rolldown-runtime.mjs +1 -1
  30. package/dist/index.mjs +749 -69
  31. package/package.json +16 -16
  32. package/dist/_chunks/libs/@chevrotain/gast.mjs +0 -1
  33. package/dist/_chunks/libs/hono.mjs +0 -1
  34. package/dist/_chunks/libs/nanoid.mjs +0 -1
package/dist/index.mjs CHANGED
@@ -1,25 +1,27 @@
1
1
  #!/usr/bin/env node
2
- import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{i as n,n as r,r as i,t as a}from"./_chunks/libs/@logtape/logtape.mjs";import{n as o,t as s}from"./_chunks/libs/merge-error-cause.mjs";import{t as c}from"./_chunks/libs/safe-stringify.mjs";import{t as l}from"./_chunks/libs/defu.mjs";import{$ as u,A as d,B as f,C as p,D as m,E as h,F as g,G as ee,H as te,I as ne,J as re,K as ie,L as ae,M as oe,N as se,O as ce,P as _,Q as le,R as ue,S as de,T as fe,U as pe,V as me,W as he,X as ge,Y as _e,Z as ve,_ as ye,a as be,at as xe,b as Se,c as Ce,ct as we,d as Te,dt as Ee,et as De,f as Oe,g as ke,h as Ae,i as je,it as Me,j as Ne,k as Pe,l as Fe,lt as Ie,m as Le,n as Re,nt as ze,o as Be,ot as Ve,p as He,q as Ue,r as We,rt as Ge,s as Ke,st as qe,t as Je,tt as v,u as Ye,ut as Xe,v as Ze,w as Qe,x as $e,y as et,z as tt}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as nt}from"./_chunks/libs/json5.mjs";import{a as rt,c as it,d as y,f as at,i as b,l as x,n as ot,o as st,p as S,r as ct,s as lt,t as ut,u as dt}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{$ as ft,A as pt,B as mt,C as ht,D as gt,E as C,F as _t,G as vt,H as yt,I as bt,J as xt,K as St,L as Ct,M as wt,N as Tt,O as Et,P as w,Q as Dt,R as Ot,S as kt,T as At,U as jt,V as Mt,W as Nt,X as Pt,Y as Ft,Z as It,_ as Lt,a as Rt,at as zt,b as Bt,c as Vt,ct as T,d as Ht,dt as Ut,et as Wt,f as Gt,ft as Kt,g as E,h as qt,i as Jt,it as Yt,j as Xt,k as D,l as Zt,lt as Qt,m as $t,mt as en,n as tn,nt as nn,o as rn,ot as O,p as an,pt as on,q as sn,r as cn,rt as k,s as ln,st as un,t as dn,tt as fn,u as pn,ut as mn,v as hn,w as gn,x as _n,y as vn,z as A}from"./_chunks/libs/remeda.mjs";import{t as yn}from"./_chunks/libs/natural-compare-lite.mjs";import{n as bn,t as xn}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as Sn,t as Cn}from"./_chunks/libs/graphology-dag.mjs";import{a as wn,c as Tn,i as En,n as Dn,o as On,r as kn,s as An,t as jn}from"./_chunks/libs/mnemonist.mjs";import{t as Mn}from"./_chunks/libs/ohash.mjs";import{n as Nn}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as Pn}from"./_chunks/libs/rehype-sanitize.mjs";import{t as Fn}from"./_chunks/libs/rehype-stringify.mjs";import{c as In,t as Ln}from"./_chunks/libs/mdast-util-from-markdown.mjs";import{t as Rn}from"./_chunks/libs/remark-gfm.mjs";import{t as zn}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Bn}from"./_chunks/libs/remark-parse.mjs";import{t as Vn}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/extend.mjs";import{t as Hn}from"./_chunks/libs/unified.mjs";import{n as Un,t as Wn}from"./_chunks/libs/immer.mjs";import{n as Gn,t as Kn}from"./_chunks/libs/fdir.mjs";import{t as qn}from"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as Jn}from"./_chunks/libs/p-queue.mjs";import{t as Yn}from"./_chunks/libs/fast-equals.mjs";import{a as Xn,c as Zn,d as Qn,f as $n,i as er,l as tr,n as nr,o as rr,r as ir,s as ar,t as or,u as sr}from"./_chunks/libs/ufo.mjs";import{t as cr}from"./_chunks/libs/@hono/node-server.mjs";import{n as lr,t as ur}from"./_chunks/libs/hono.mjs";import{t as dr}from"./_chunks/libs/nanoid.mjs";import{a as fr,i as pr,n as mr,r as hr,t as gr}from"./_chunks/libs/@lume/kiwi.mjs";import{n as _r,r as vr,t as j}from"./_chunks/libs/ts-graphviz.mjs";import{t as yr}from"./_chunks/libs/word-wrap.mjs";import{n as br,r as xr,t as Sr}from"./_chunks/libs/khroma.mjs";import{t as Cr}from"./_chunks/libs/graphology.mjs";import{t as wr}from"./_chunks/libs/p-limit.mjs";import{t as Tr}from"./_chunks/libs/pretty-ms.mjs";import{t as Er}from"./_chunks/libs/@msgpack/msgpack.mjs";import{t as Dr}from"./_chunks/libs/@smithy/util-base64.mjs";import{t as Or}from"./_chunks/libs/strip-indent.mjs";import{n as kr,t as Ar}from"./_chunks/libs/citty.mjs";import{isColorSupported as jr}from"std-env";import{dirname as Mr,resolve as Nr}from"node:path";import{bundleRequire as Pr}from"bundle-require";import*as Fr from"node:fs/promises";import{stat as Ir,unlink as Lr,writeFile as Rr}from"node:fs/promises";import{mkdirSync as zr}from"node:fs";import{Graphviz as Br}from"@hpcc-js/wasm-graphviz";const Vr=e=>e.split(`
3
- `).map(e=>e.trim().replace(`file://`,``));function Hr(e,t=2){e=Array.isArray(e)?e:e.split(`
2
+ import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{i as n,n as r,r as i,t as a}from"./_chunks/libs/@logtape/logtape.mjs";import{n as o,t as s}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import"./_chunks/libs/is-plain-obj.mjs";import{t as c}from"./_chunks/libs/safe-stringify.mjs";import{t as l}from"./_chunks/libs/defu.mjs";import{$ as u,A as d,B as f,C as p,D as m,E as h,F as g,G as ee,H as te,I as ne,J as re,K as ie,L as ae,M as oe,N as se,O as ce,P as le,Q as ue,R as de,S as fe,T as pe,U as me,V as he,W as ge,X as _e,Y as ve,Z as ye,_ as be,a as xe,at as Se,b as Ce,c as we,ct as Te,d as Ee,dt as De,et as Oe,f as ke,ft as Ae,g as je,h as Me,i as Ne,it as Pe,j as Fe,k as _,l as Ie,lt as Le,m as Re,n as ze,nt as v,o as Be,ot as Ve,p as He,q as Ue,r as We,rt as Ge,s as Ke,st as qe,t as Je,tt as Ye,u as Xe,ut as Ze,v as Qe,w as $e,x as et,y as tt,z as nt}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as rt}from"./_chunks/libs/json5.mjs";import{J as y,i as it,n as at,r as ot,t as st}from"./_chunks/libs/@hono/mcp.mjs";import{a as ct,c as lt,d as ut,f as dt,h as ft,i as pt,l as mt,m as ht,n as gt,o as _t,p as vt,r as yt,s as bt,t as xt,u as St}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as Ct,A as b,B as wt,C as Tt,D as x,E as Et,F as S,G as Dt,H as Ot,I as kt,J as At,K as jt,L as Mt,M as Nt,N as Pt,O as Ft,P as It,Q as C,R as Lt,S as Rt,T as zt,U as Bt,V as Vt,W as Ht,X as Ut,Y as Wt,Z as Gt,_ as Kt,a as qt,at as Jt,b as Yt,c as Xt,ct as w,d as Zt,dt as Qt,et as $t,f as en,ft as tn,g as T,h as nn,ht as rn,i as an,it as on,j as sn,k as cn,l as ln,lt as un,m as dn,mt as fn,n as pn,nt as mn,o as hn,ot as E,p as gn,pt as _n,q as vn,r as yn,rt as D,s as bn,st as xn,t as Sn,tt as Cn,u as wn,ut as Tn,v as En,w as Dn,x as On,y as kn,z as An}from"./_chunks/libs/remeda.mjs";import{t as jn}from"./_chunks/libs/natural-compare-lite.mjs";import{n as Mn,t as Nn}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as Pn,t as Fn}from"./_chunks/libs/graphology-dag.mjs";import{a as In,i as Ln,n as Rn,o as zn,r as Bn,s as Vn,t as Hn}from"./_chunks/libs/mnemonist.mjs";import{t as Un}from"./_chunks/libs/ohash.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as Wn}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as Gn}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Kn}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as qn,t as Jn}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Yn}from"./_chunks/libs/remark-gfm.mjs";import{t as Xn}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Zn}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as Qn}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/trough.mjs";import{t as $n}from"./_chunks/libs/unified.mjs";import{n as er,t as tr}from"./_chunks/libs/immer.mjs";import{n as nr,t as rr}from"./_chunks/libs/fdir.mjs";import{t as ir}from"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as ar}from"./_chunks/libs/p-queue.mjs";import{a as or,c as O,d as k,f as sr,i as cr,l as A,n as lr,o as ur,p as dr,r as j,s as fr,t as pr,u as mr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{a as hr,c as gr,d as _r,i as vr,l as yr,n as br,o as xr,r as Sr,s as Cr,t as wr,u as Tr}from"./_chunks/libs/ufo.mjs";import{t as Er}from"./_chunks/libs/@hono/node-server.mjs";import{t as Dr}from"./_chunks/libs/fast-equals.mjs";import{a as Or,i as kr,n as Ar,r as jr,t as Mr}from"./_chunks/libs/@lume/kiwi.mjs";import{n as Nr,r as Pr,t as M}from"./_chunks/libs/ts-graphviz.mjs";import{t as Fr}from"./_chunks/libs/word-wrap.mjs";import{n as Ir,r as Lr,t as Rr}from"./_chunks/libs/khroma.mjs";import{t as zr}from"./_chunks/libs/graphology.mjs";import{t as Br}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Vr}from"./_chunks/libs/pretty-ms.mjs";import{t as Hr}from"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/@smithy/is-array-buffer.mjs";import{t as Ur}from"./_chunks/libs/@smithy/util-base64.mjs";import{t as Wr}from"./_chunks/libs/strip-indent.mjs";import"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as Gr}from"./_chunks/libs/which.mjs";import{n as Kr,t as qr}from"./_chunks/libs/citty.mjs";import{isColorSupported as Jr}from"std-env";import{basename as Yr,dirname as Xr,resolve as Zr}from"node:path";import{bundleRequire as Qr}from"bundle-require";import{formatMessagesSync as $r}from"esbuild";import*as ei from"node:fs/promises";import{unlink as ti,writeFile as ni}from"node:fs/promises";import{mkdirSync as ri,statSync as ii}from"node:fs";import"node:os";import{Graphviz as ai}from"@hpcc-js/wasm-graphviz";const oi=e=>e.split(`
3
+ `).map(e=>e.trim().replace(`file://`,``));function si(e,t=2){e=Array.isArray(e)?e:e.split(`
4
4
  `);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
5
- `)}function M(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=s(e);if(t.stack){let e=Vr(t.stack);return t.message+`
6
- `+Hr(e.slice(1))}return t.message}return c(e,{indentation:` `})}function Ur(e,t){return o(e,t)}function Wr(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=s(t);return e.stack&&=Vr(e.stack).join(`
7
- `),[e]}return e===`error`||e===`err`?[Error(`${t}`)]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function Gr(e,t=!1){let n=Wr(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
8
- `+Hr(n.stack.split(`
9
- `).slice(1))),t&&(r=`${Yr.red}${r}${Jr}`),{...e,message:e.message+`
10
- `+Hr(r)}}return e}const Kr={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`},qr=e=>Kr[e],Jr=`\x1B[0m`,Yr={red:`\x1B[31m`};function Xr(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return i({timestamp:`time`,level:qr,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(Gr(e,!0))})}function Zr(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function Qr(e){return r({formatter:Zr(),...e})}function $r(e){let t=e?.formatter??Zr();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const ei=n(`likec4`);function ti(e){return ei.getChild(e)}function ni(e){try{let t=e?.sinks??{};a({reset:!0,...e,sinks:{console:Qr(),...t},loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}const ri=/^@[A-Za-z0-9_-]*$/,ii=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,ai=S.string().min(1,`Image alias value cannot be empty`).regex(ii,`Image alias value must be a relative path (no leading slash or protocol)`),oi=S.record(S.string(),ai).meta({description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`});function si(e){let t=[],n=[];if(e)for(let[r,i]of Object.entries(e))ri.test(r)||t.push(r),ii.test(i)||n.push(`${r} -> ${i}`);if(t.length||n.length){let e=[];throw t.length&&e.push(`Invalid image alias key(s): ${t.map(e=>JSON.stringify(e)).join(`, `)} (must match ${ri})`),n.length&&e.push(`Invalid image alias value(s): ${n.map(e=>JSON.stringify(e)).join(`, `)} (must match ${ii})`),Error(e.join(` | `))}}const ci=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,li=S.string().min(1,`Include path cannot be empty`).regex(ci,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),ui=S.strictObject({paths:S.array(li).min(1,`Include paths cannot be empty`).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
11
- `)}),maxDepth:S.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
12
- `)}),fileThreshold:S.number().int().min(1).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
13
- `)})}).meta({id:`include-config`,description:`Configuration for including additional LikeC4 source files`}).optional().meta({description:[`Configuration for including additional LikeC4 source files from other directories.`,`Example: { "paths": ["../shared", "../common/specs"], "maxDepth": 5, "fileThreshold": 50 }`].join(`
14
- `)});function di(e){return e||{paths:[],maxDepth:3,fileThreshold:30}}function fi(e){if(!e?.paths)return;let t=[];for(let n of e.paths)ci.test(n)||t.push(n);if(t.length>0)throw Error(`Invalid include path(s): ${t.map(e=>JSON.stringify(e)).join(`, `)} (must be relative paths without leading slash, drive letter, or protocol)`)}const pi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},mi={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},hi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},gi={primary:pi,blue:pi,secondary:mi,sky:mi,muted:hi,slate:hi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},_i={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},vi={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},yi={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},bi={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},xi={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:yi,gray:_i,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:vi,primary:yi,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:bi,sky:bi,slate:vi},Si={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Ci=[`xs`,`sm`,`md`,`lg`,`xl`],wi=[`left`,`right`,`top`,`bottom`],Ti=[`solid`,`dashed`,`dotted`,`none`],Ei=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`],Di=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Oi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],ki={colors:Di.reduce((e,t)=>(e[t]={elements:gi[t],relationships:xi[t]},e),{}),...Si};var Ai=t(yn(),1);function ji(e,t){return e===t?0:pt(e)?pt(t)?(0,Ai.default)(e,t):1:pt(t)?-1:0}function Mi(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Ai.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Ni(e){let t=[],n=[];for(let[r,i]of Yt(e))D(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return T(n,Ht(ji),C((e,t)=>({tag:e,spec:{color:N(Oi[t%Oi.length])}})),mn(t),Ht((e,t)=>ji(e.tag,t.tag)),qt(E(`tag`),E(`spec`)))}function Pi(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,T(dn(e,t),ln(([e,t])=>n(e,t)),C(([e,t])=>e)))}function Fi(e){return e!=null&&typeof e==`string`}function Ii(e){return!!e&&Array.isArray(e)&&e.length>0}function Li(...e){return t=>e.some(e=>e(t))}function Ri(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function zi(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const Bi=e=>Fi(e)?e:e.id;function I(e,t){let n=Bi(e);return t?Bi(t).startsWith(n+`.`):e=>{let t=Bi(e);return n.startsWith(t+`.`)}}function Vi(e,t){if(!t)return t=>Vi(e,t);let n=Bi(e),r=Bi(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function Hi(e,t){return t?I(t,e):t=>I(e,t)}function Ui(e){return(Fi(e)?e:e.id).split(`.`).length}function Wi(e,t){let n=Fi(e)?e:e.id,r=Fi(t)?t:t.id;if(n===r)return 0;let i=Ui(n),a=Ui(r);if(Vi(n,r))return Math.abs(i-a);let o=Gi(n,r),s=o?Ui(o):0;return i+a-(2*s+1)}function Gi(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function Ki(e){let t=e.split(`.`);return t.pop(),t.length===0?[]:t.reduce((e,t,n)=>n===0?(e.push(t),e):(e.unshift(`${e[0]}.${t}`),e),[])}function qi(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function Ji(e,t){return qi(e.id,t.id)}function Yi(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function Xi(e,t){let n=t;for(let t of e)I(t,n)&&(n=t);return n===t?null:n}function Zi(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=Xi(n,r);)t.push(n.splice(n.indexOf(e),1)[0]);t.push(r)}return t}function Qi(e,t){if(!e||Fi(e)){let t=e??`asc`;return e=>Qi(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=ji(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function $i(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function ea(e){return bt(e)&&typeof e==`object`&&Symbol.iterator in e}function ta(e,t){let n=t??e;P(Ct(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function na(e,t){let n=t??e;P(Ct(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function ra(e){return e?ia(e):ia}function*ia(e){for(let t of e)yield*t}function aa(e){return e?oa(e):oa}function oa(e){let{value:t}=e[Symbol.iterator]().next();return t}function sa(e,t){let n=t??e;P(Ct(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function ca(e,t){let n=t??e;P(Ct(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function la(e){return e?new Set(e):e=>new Set(e)}function ua(e){return e?da(e):da}function*da(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function fa(...e){let t=100;return e.length===2?t=$t(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function pa(){return Promise.resolve().then(()=>void 0)}function ma(e){Promise.resolve().then(e)}const ha=(e,t)=>{let n=Gi(e.source.id,e.target.id),r=Gi(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?qi(n,r):0;if(i!==0)return i;let a=qi(e.source.id,t.source.id);return a===0?qi(e.target.id,t.target.id):a};function ga(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function _a(e,...t){let n=new Set;if(e.size===0)return n;let r=O(t,2)?(0,An.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function z(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function va(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function ya(e,t){return(0,An.symmetricDifference)(e,t)}function ba(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function xa(e){return P(typeof e==`object`&&bt(e),`objectHash: value must be an object`),Mn(e)}function Sa(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function Ca(){return Hn().use(Bn).use(Rn).use(zn).use(Vn,{allowDangerousHtml:!0}).use(Pn,l({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},Nn)).use(Fn,{allowDangerousHtml:!0})}function wa(e){return(``+Ca().processSync(e)).trim()}function Ta(e){return In(Ln(e),{includeHtml:!1,includeImageAlt:!1})}function Ea(e){P(bn.valid(e),`Invalid color: ${e}`);let t=xn(e),n=t[6],r=Da(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Da(e){let t=bn(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=bn.contrastAPCA(t,n),s=bn.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!vt(n,i)||!vt(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const Oa={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},ka=ki,Aa=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function B(e){return kt(e,e=>e===void 0)}function ja(e){return e.summary??e.description}function Ma(e){return e.description??e.summary}let Na;(function(e){function t({x:e,y:t,width:n,height:r}){return{x:e+n/2,y:t+r/2}}e.center=t;function n({x:e,y:t,width:n,height:r}){return[{x:e,y:t},{x:e+n,y:t},{x:e+n,y:t+r},{x:e,y:t+r}]}e.toPoints=n;function r(e){let{x1:t,y1:n,x2:r,y2:i}=Pa.fromPoints(e);return{x:t,y:n,width:r-t,height:i-n}}e.fromPoints=r;function i(...e){if(P(O(e,1),`No boxes provided`),e.length===1)return e[0];let t=e[0].x,n=e[0].y,r=e[0].x+e[0].width,i=e[0].y+e[0].height;for(let a=1;a<e.length;a++){let o=e[a];t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x+o.width),i=Math.max(i,o.y+o.height)}return{x:Math.floor(t),y:Math.floor(n),width:Math.round(r-t),height:Math.round(i-n)}}e.merge=i;function a(e){return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}}e.fromRectBox=a;function o(e){return{x1:e.x,y1:e.y,x2:e.x+e.width,y2:e.y+e.height}}e.toRectBox=o;function s(e,t){return t===0?e:{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}e.expand=s;function c(e,t){return t===0?e:{x:e.x+t,y:e.y+t,width:e.width-t*2,height:e.height-t*2}}e.shrink=c;function l(e,t){return e===t?!0:e.x<=t.x&&e.y<=t.y&&e.x+e.width>=t.x+t.width&&e.y+e.height>=t.y+t.height}e.includes=l})(Na||={});let Pa;(function(e){function t({x1:e,y1:t,x2:n,y2:r}){return{x:(e+n)/2,y:(t+r)/2}}e.center=t;function n(e){P(e.length>0,`At least one point is required`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.min(n,o),r=Math.max(r,a),i=Math.max(i,o);return{x1:t,y1:n,x2:r,y2:i}}e.fromPoints=n;function r(...e){P(e.length>0,`No boxes provided`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x1),n=Math.min(n,a.y1),r=Math.max(r,a.x2),i=Math.max(i,a.y2);return{x1:t,y1:n,x2:r,y2:i}}e.merge=r;function i(e){return{x:e.x1,y:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}}e.toBBox=i;function a(e,t){return e===t?!0:e.x1<=t.x1&&e.y1<=t.y1&&e.x2>=t.x2&&e.y2>=t.y2}e.includes=a})(Pa||={});var Fa=class e{constructor(e,t){this.x=e,this.y=t}static create(...t){return t.length===2?new e(t[0],t[1]):new e(t[0].x,t[0].y)}static add(e,t){return{x:e.x+t.x,y:e.y+t.y}}static subtract(e,t){return{x:e.x-t.x,y:e.y-t.y}}static multiply(e,t){return{x:e.x*t,y:e.y*t}}static divide(e,t){return{x:e.x/t,y:e.y/t}}static dot(e,t){return e.x*t.x+e.y*t.y}add(t){return new e(this.x+t.x,this.y+t.y)}subtract(t){return new e(this.x-t.x,this.y-t.y)}multiply(t){return new e(this.x*t,this.y*t)}divide(t){return new e(this.x/t,this.y/t)}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}length(){return this.x===0&&this.y===0?0:Math.sqrt(this.x**2+this.y**2)}normalize(){let t=this.length();return t===0?new e(0,0):new e(this.x/t,this.y/t)}round(){return new e(Math.round(this.x),Math.round(this.y))}toObject(){return{x:this.x,y:this.y}}};function Ia(e,t){return e[La]===t}const La=`_stage`,Ra=`_type`,za=`_layout`;function Ba(e){return e}function Va(e){if(e==null)return null;let t=pt(e)?e:e.txt??e.md;return D(t?.trim())?t:null}function Ha(e,t){return t?t+`.`+e:e}const Ua=`@group`;function Wa(e){return e.kind===Ua}function Ga(e){return e}function Ka(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function qa(e){return e.startsWith(`@`)}function Ja(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function Ya(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function Xa(e){return e.startsWith(`step-`)}function Za(e){if(!Xa(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let V;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(pt(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return Ka(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(V||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&V.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(H||={});let Qa;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(Qa||={});let $a;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return Qa.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return Qa.is(e)||Qa.isWhere(e)||Qa.isCustom(e)}e.isRelation=a})($a||={});let U;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(U||={});let eo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(eo||={});let to;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return eo.isWhere(e)}e.isRelationWhere=n;function r(e){return U.isWhere(e)}e.isFqnExprWhere=r;function i(e){return U.is(e)||U.isWhere(e)||U.isCustom(e)}e.isFqnExpr=i;function a(e){return eo.is(e)||eo.isWhere(e)||eo.isCustom(e)}e.isRelationExpr=a})(to||={});function no(e){return D(e.kind)&&!D(e.element)}function ro({size:e,padding:t,textSize:n,iconSize:r,...i},a=Mo.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function io(e){return`tag`in e}function ao(e){return`kind`in e}function oo(e){return`participant`in e}function so(e){return`not`in e}function co(e){return`and`in e}function lo(e){return`or`in e}function uo(e){switch(!0){case oo(e):{let t=e.participant;return fo(t,uo(e.operator))}case io(e):{if(pt(e.tag)||`eq`in e.tag){let t=pt(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case ao(e):{if(pt(e.kind)||`eq`in e.kind){let t=pt(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>w(e.kind)||e.kind!==t}case so(e):return _t(uo(e.not));case co(e):return en(e.and.map(uo));case lo(e):return on(e.or.map(uo));default:F(e)}}function fo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function po(e){return`include`in e||`exclude`in e}function mo(e){return`targets`in e&&`style`in e}function ho(e){return e._type===`element`}function go(e){return ho(e)&&D(e.extends)}function _o(e){return e._type===`deployment`}function vo(e){return e._type===`dynamic`}function yo(e){return`styleId`in e}function bo(e){return`predicateId`in e}function xo(e){return e===`TB`||e===`BT`||e===`LR`||e===`RL`}function So(e){return`direction`in e}function Co(e){return Xa(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function wo(e){return!!e&&`__parallel`in e&&yt(e.__parallel)}function To(e){return!!e&&`__series`in e&&yt(e.__series)}function Eo(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function Do(e){return`rank`in e&&Array.isArray(e.targets)}const Oo=Symbol.for(`text`),ko=Symbol.for(`html`);var Ao=class e{static mdcache=new wn.default(500);static txtcache=new wn.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Oo,()=>Ta(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,ko,()=>wa(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function jo(e,t){let n=t??6,r=bn(e.fill),i=bn(e.stroke),a=r.luminance()>.8,o=T(dn(bn.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),bn.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),C(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Mo={theme:ka,defaults:Oa};var No=class e{theme;defaults;static DEFAULT=new e(Mo);static from(...t){return O(t,1)?new e(l(...t,Mo)):this.DEFAULT}constructor(e){this.config=e,this.theme=e.theme,this.defaults=e.defaults}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;return e?R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements})):this.elementColors}isDefaultColor(e){return e===this.defaults.color}colors(e){if(e??=this.defaults.color,this.isThemeColor(e))return this.theme.colors[e];throw Error(`Unknown color: ${e}`)}compoundColorsCache=new kn.default(e=>new Dn.default(t=>jo(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=ro(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){return this.isThemeColor(e)?this.theme.colors[e]:R(this,`compute-${e}`,()=>{if(!bn.valid(e))throw Error(`Invalid color value: "${e}"`);return Ea(e)})}equals(e){return e===this?!0:this.constructor===e.constructor?vt(this.config,e.config):!1}};const Po=S.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),Fo=S.literal(Ei).meta({id:`ElementShape`}),Io=S.literal(Ti).meta({id:`BorderStyle`}),Lo=S.literal(Ci).meta({id:`ElementSize`}),Ro=S.literal(wi).meta({id:`IconPosition`}),zo=S.literal(Aa).meta({id:`ArrowType`}),Bo=S.literal([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),Vo=S.literal(Di).meta({id:`ThemeColor`}),Ho=S.string().min(1,`Custom color name cannot be empty`).transform(e=>e).meta({id:`CustomColorName`}),Uo=S.union([Vo,Ho]).transform(e=>e).meta({id:`ColorName`}),Wo=S.string().min(1,`Color value cannot be empty`).transform(e=>e).meta({id:`ColorLiteral`,description:`Color value in any valid CSS format: hex, rgb, rgba, hsl, hsla ...`}),Go=S.strictObject({fill:Wo.meta({description:`Background color`}),stroke:Wo.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Wo.meta({description:`High contrast text color (title)`}),loContrast:Wo.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),Ko=S.strictObject({line:Wo.meta({description:`Line color`}),label:Wo.meta({description:`Label text color`}),labelBg:Wo.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),qo=S.strictObject({elements:S.union([Wo,Go]).meta({description:`Element color value (or a breakdown of specific color values)`}).transform(e=>typeof e==`string`?Ea(e).elements:e),relationships:S.union([Wo,Ko]).meta({description:`Relationship color value (or a breakdown of specific color values)`}).transform(e=>typeof e==`string`?Ea(e).relationships:e)}).meta({id:`StrictThemeColorValues`}),Jo=S.union([Wo,qo]).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}).transform(e=>typeof e==`string`?Ea(e):e),Yo=S.record(Uo,Jo).meta({id:`ThemeColors`,description:`Override theme colors`}).transform(e=>e),Xo=S.strictObject({width:S.number().min(50),height:S.number().min(50)}).meta({id:`Dimensions`,description:`Dimensions`}),Zo=S.strictObject(Ft(Ci,()=>Xo.optional())).meta({id:`ThemeSizes`,description:`Override theme sizes`}),Qo=S.strictObject({colors:Yo.optional(),sizes:Zo.optional()}).meta({id:`ThemeCustomization`,description:`Theme customization`}).transform(({colors:e,sizes:t})=>B({colors:e?B(e):void 0,sizes:t?B(t):void 0})),$o=S.strictObject({color:Uo.optional().meta({description:`Default color for groups
15
- (must be a valid color name from the theme)`}),opacity:Po.optional().meta({description:`Default opacity for groups`}),border:Io.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`,description:`Override default values for group style properties
16
- These values will be used if such property is not defined`}),es=S.strictObject({color:Uo.optional().meta({description:`Default color for relationships
17
- (must be a valid color name from the theme)`}),line:Bo.optional().meta({description:`Default line style for relationships`}),arrow:zo.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
18
- These values will be used if such property is not defined`}),ts=S.strictObject({color:Uo.optional().meta({description:`Default color for elements
19
- (must be a valid color name from the theme)`}),opacity:Po.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:Io.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:Lo.optional().meta({description:`Default size for elements`}),shape:Fo.optional().meta({description:`Default shape for elements`}),iconPosition:Ro.optional().meta({description:`Default icon position for elements`}),group:$o.optional().meta({description:`Default style values for groups`}),relationship:es.optional().meta({description:`Default style values for relationships`})}).meta({id:`DefaultStyleValues`,description:`Override default values for style properties
20
- These values will be used if such property is not defined`}),ns=S.union([S.string().min(1,`Custom CSS file path cannot be empty`),S.array(S.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`,description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`}),rs=S.strictObject({theme:Qo.optional(),defaults:ts.optional(),customCss:ns.optional()}).meta({id:`StylesConfiguration`,description:`Project styles customization`}).transform(({theme:e,defaults:t,customCss:n})=>B({defaults:is(t),customCss:as(n),theme:e}));function is(e){if(!e)return;let{relationship:t,group:n,...r}=e;return B({...r,relationship:t&&B(t),group:n&&B(n)})}function as(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const os=S.strictObject({outDir:S.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
21
- `)})}).meta({id:`manual-layouts-config`,description:`Configuration for manual layouts`}),ss=S.object({name:S.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),title:S.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:S.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),imageAliases:oi.optional(),include:ui,styles:rs.optional(),exclude:S.array(S.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:os.optional()}).meta({description:`LikeC4 project configuration`}),cs=S.instanceof(Function),ls=S.record(S.string(),cs),us=ss.extend({generators:ls.optional()});function ds(e){let t=us.safeParse(typeof e==`string`?nt.parse(e):e);if(!t.success)throw Error(`Config validation failed:
22
- `+S.prettifyError(t.error));return t.data.imageAliases&&si(t.data.imageAliases),t.data.include&&fi(t.data.include),t.data}const fs=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],ps=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...fs,...ps];function ms(e){for(let t of fs)if(e.endsWith(t))return!0;return!1}function hs(e){for(let t of ps)if(e.endsWith(t))return!0;return!1}function gs(e){return ms(e)||hs(e)}function _s(e){return us.parse(e)}function vs(e){return T(e,k(e=>!!e.notation),sn(E(`notation`)),gn(Lt(sn(E(`shape`)),gn(Lt(sn(E(`color`)),gn(Lt(C(E(`kind`)),Rt())),Yt(),C(([e,t])=>({kinds:t,color:e})))),Yt(),Dt(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),Yt(),Dt(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),pn(E(`shape`),E(`title`),[e=>e.kinds.length,`desc`]))}const ys=(e,t)=>e===t||w(e)&&w(t)?!1:!vt(e,t);function bs(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],w(t.style.border)?delete e.style.border:e.style.border=t.style.border,Tt(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,w(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function xs(e,t,n){if(ys(t.icon??`none`,e.icon??`none`)){let r=D(e.icon)&&e.icon!==`none`;switch(!0){case r&&D(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(w(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&D(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Ss(e,t,n){let r=!0;return ys(e.style.iconColor,t.style.iconColor)&&(w(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),ys(e.style.iconSize,t.style.iconSize)&&(n?w(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),ys(e.style.iconPosition,t.style.iconPosition)&&(n?w(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Cs(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function ws(e,t,n){let r=!0;return ys(e.title,t.title)&&(n?e.title=t.title:r=!1),ys(e.description,t.description)&&(w(t.description)?delete e.description:n?e.description=Cs(e.description,t.description):r=!1),ys(e.technology,t.technology)&&(w(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Ts(e,t,n){return e.title=t.title,w(t.description)?delete e.description:e.description=Cs(e.description,t.description),w(t.technology)?delete e.technology:e.technology=t.technology,!0}function Es(e,t){P(e.id===t.id,`applyManualLayout: view ids do not match`),P(e._stage===`layouted`,`applyManualLayout: expected layouted view`),P(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),P(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Ds(t.nodes,e.nodes,n),i=Os(t.edges,e.edges,n),a=vs(r);return Un(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[za]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=Wn(r),o.edges=Wn(i),vo(e)&&o._type===`dynamic`&&(o.variant=e.variant),ho(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];O(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Ds(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),Un(e,r=>{bs(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(ys(r.modelRef,t.modelRef)||ys(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),ys(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;ys(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Ss(r,t,s)||i.add(`label-changed`),xs(r,t,s&&o===a)||i.add(`label-changed`),(a?Ts:ws)(r,t,s)||i.add(`label-changed`),ys(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&ya(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];O(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Os(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??T(r.values(),ta(t=>t.source===e.source&&t.target===e.target),aa());return t&&r.delete(t.id),Un(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:ys(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:P(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),P(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),P(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),ys(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,ys(e.notes,t.notes)&&(w(e.notes)!==w(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,ys(vn(e,[`label`,`description`,`technology`,`labelBBox`]),vn(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),ys(e.label,t.label)&&(w(t.label)!==w(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),ys(e.description,t.description)&&(w(t.description)!==w(e.description)&&i.add(`label-changed`),t.description&&(r.description=Cs(e.description,t.description))),ys(e.technology,t.technology)&&(w(t.technology)!==w(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:P(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),P(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];O(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function ks(e,t){let{drifts:n,...r}=Es(e,t);if(!n||n.length===0)return Un(e,e=>{delete e.drifts,e[za]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),Un(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??T(o.values(),ta(t=>t.source===e.source&&t.target===e.target),aa());return t&&o.delete(t.id),Un(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return Un(e,e=>{O(l,1)?e.drifts=l:delete e.drifts,e.nodes=Wn(s),e.edges=Wn(c),e[za]=`auto`})}async function As(e){let t=ei.getChild(`config`);if(t.debug`Loading config file: ${e.fsPath}`,ms(e.fsPath))try{return ds(await Fr.readFile(e.fsPath,`utf-8`))}catch(n){throw t.error(`Failed to load json config file: ${e.fsPath}`,{err:n}),n}P(hs(e.fsPath),`Invalid config file: ${e.fsPath}`);try{let t=Mr(e.fsPath),{mod:n}=await Pr({filepath:e.fsPath,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
5
+ `)}function ci(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=s(e);if(t.stack){let e=oi(t.stack);return t.message+`
6
+ `+si(e.slice(1))}return t.message}return c(e,{indentation:` `})}function li(e,t){return o(e,t)}function ui(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=s(t);return e.stack&&=oi(e.stack).join(`
7
+ `),[e]}return e===`error`||e===`err`?[Error(ci(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function di(e,t=!1){let n=ui(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
8
+ `+si(n.stack.split(`
9
+ `).slice(1))),t&&(r=`${hi.red}${r}${mi}`),{...e,message:e.message+`
10
+ `+si(r)}}return e}const fi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`},pi=e=>fi[e],mi=`\x1B[0m`,hi={red:`\x1B[31m`};function gi(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return i({timestamp:`time`,level:pi,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(di(e,!0))})}function _i(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function vi(e){return r({formatter:_i(),...e})}function yi(e){let t=e?.formatter??_i();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const bi=n(`likec4`);function xi(e){return bi.getChild(e)}function Si(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:vi(),...t};a({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}const Ci=/^@[A-Za-z0-9_-]*$/,wi=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,Ti=y.string().min(1,`Image alias key cannot be empty`).regex(Ci,`Image alias key must match /^@\\w+$/`),Ei=y.string().min(1,`Image alias value cannot be empty`).regex(wi,`Image alias value must be a relative path (no leading slash or protocol)`),Di=y.record(Ti,Ei).meta({id:`ImageAliases`,description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`}),Oi=y.string().min(1,`Include path cannot be empty`).regex(/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),ki=y.strictObject({paths:y.array(Oi).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
11
+ `)}),maxDepth:y.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
12
+ `)}),fileThreshold:y.number().int().min(1).max(1e4).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
13
+ `)})}).meta({id:`include-config`,description:[`Configuration for including additional LikeC4 source files from other directories.`,`Example: { "paths": ["../shared", "../common/specs"], "maxDepth": 5, "fileThreshold": 50 }`].join(`
14
+ `)}),Ai={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},ji={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},Mi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},Ni={primary:Ai,blue:Ai,secondary:ji,sky:ji,muted:Mi,slate:Mi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},Pi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Fi={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Ii={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Li={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},Ri={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Ii,gray:Pi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:Fi,primary:Ii,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Li,sky:Li,slate:Fi},zi={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Bi=[`xs`,`sm`,`md`,`lg`,`xl`],Vi=[`left`,`right`,`top`,`bottom`],Hi=[`solid`,`dashed`,`dotted`,`none`],Ui=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Wi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Gi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Ki={tomato:vt.tomato9,grass:pt.grass9,blue:gt.blue9,ruby:ut.ruby9,orange:bt.orange9,indigo:ct.indigo9,pink:lt.pink9,teal:dt.teal9,purple:mt.purple9,amber:xt.amber9,crimson:yt.crimson9,red:St.red9,lime:_t.lime9,yellow:ft.yellow9,violet:ht.violet9};function qi(e){return e in Ki}const Ji={colors:Wi.reduce((e,t)=>(e[t]={elements:Ni[t],relationships:Ri[t]},e),{}),...zi};var Yi=t(jn(),1);function Xi(e,t){return e===t?0:sn(e)?sn(t)?(0,Yi.default)(e,t):1:sn(t)?-1:0}function Zi(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Yi.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Qi(e){let t=[],n=[];for(let[r,i]of on(e))b(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return w(n,Zt(Xi),x((e,t)=>({tag:e,spec:{color:N(Gi[t%Gi.length])}})),Tn(t),Zt((e,t)=>Xi(e.tag,t.tag)),nn(T(`tag`),T(`spec`)))}function $i(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,w(Sn(e,t),bn(([e,t])=>n(e,t)),x(([e,t])=>e)))}function ea(e){return e!=null&&typeof e==`string`}function ta(e){return!!e&&Array.isArray(e)&&e.length>0}function na(...e){return(t=>e.some(e=>e(t)))}function ra(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function ia(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const aa=e=>ea(e)?e:e.id;function I(e,t){let n=aa(e);return t?aa(t).startsWith(n+`.`):e=>{let t=aa(e);return n.startsWith(t+`.`)}}function oa(e,t){if(!t)return t=>oa(e,t);let n=aa(e),r=aa(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function sa(e,t){return t?I(t,e):t=>I(e,t)}function ca(e){return(ea(e)?e:e.id).split(`.`).length}function la(e,t){let n=ea(e)?e:e.id,r=ea(t)?t:t.id;if(n===r)return 0;let i=ca(n),a=ca(r);if(oa(n,r))return Math.abs(i-a);let o=ua(n,r),s=o?ca(o):0;return i+a-(2*s+1)}function ua(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function da(e){let t=e.split(`.`);if(t.pop(),!E(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function fa(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function pa(e,t){return fa(e.id,t.id)}function ma(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ha(e,t){let n=t;for(let t of e)t!==n&&I(t,n)&&(n=t);return n===t?null:n}function ga(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ha(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function _a(e,t){if(!e||ea(e)){let t=e??`asc`;return e=>_a(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Xi(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function va(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function ya(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ba(e,t){let n=t??e;P(Lt(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function xa(e,t){let n=t??e;P(Lt(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function Sa(e){return e?Ca(e):Ca}function*Ca(e){for(let t of e)yield*t}function wa(e){return e?Ta(e):Ta}function Ta(e){let{value:t}=e[Symbol.iterator]().next();return t}function Ea(e,t){let n=t??e;P(Lt(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function Da(e,t){let n=t??e;P(Lt(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function Oa(e){return e?new Set(e):e=>new Set(e)}function ka(e){return e?Aa(e):Aa}function*Aa(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function ja(...e){let t=100;return e.length===2?t=dn(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function Ma(){return Promise.resolve().then(()=>void 0)}function Na(e){Promise.resolve().then(e)}const Pa=(e,t)=>{let n=ua(e.source.id,e.target.id),r=ua(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?fa(n,r):0;if(i!==0)return i;let a=fa(e.source.id,t.source.id);return a===0?fa(e.target.id,t.target.id):a};function Fa(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function Ia(e,...t){let n=new Set;if(e.size===0)return n;let r=E(t,2)?(0,zn.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function z(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function La(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function Ra(e,t){return(0,zn.symmetricDifference)(e,t)}function za(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function Ba(e){return P(typeof e==`object`&&Mt(e),`objectHash: value must be an object`),Un(e)}function Va(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function Ha(){return $n().use(Zn).use(Yn).use(Xn).use(Qn,{allowDangerousHtml:!0}).use(Gn,l({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},Wn)).use(Kn,{allowDangerousHtml:!0})}function Ua(e){return(``+Ha().processSync(e)).trim()}function Wa(e){return qn(Jn(e),{includeHtml:!1,includeImageAlt:!1})}function Ga(e){P(Mn.valid(e),`Invalid color: ${e}`);let t=Nn(e),n=t[6],r=Ka(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Ka(e){let t=Mn(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=Mn.contrastAPCA(t,n),s=Mn.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!jt(n,i)||!jt(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const qa={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},Ja=Ji,Ya=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function B(e){return Tt(e,e=>e===void 0)}function Xa(e){return e.summary??e.description}function Za(e){return e.description??e.summary}const Qa={center({x:e,y:t,width:n,height:r}){return{x:e+n/2,y:t+r/2}},toPoints({x:e,y:t,width:n,height:r}){return[{x:e,y:t},{x:e+n,y:t},{x:e+n,y:t+r},{x:e,y:t+r}]},fromPoints(e){let{x1:t,y1:n,x2:r,y2:i}=$a.fromPoints(e);return{x:t,y:n,width:r-t,height:i-n}},merge(...e){if(P(E(e,1),`No boxes provided`),e.length===1)return e[0];let t=e[0].x,n=e[0].y,r=e[0].x+e[0].width,i=e[0].y+e[0].height;for(let a=1;a<e.length;a++){let o=e[a];t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x+o.width),i=Math.max(i,o.y+o.height)}return{x:Math.floor(t),y:Math.floor(n),width:Math.round(r-t),height:Math.round(i-n)}},fromRectBox(e){return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}},toRectBox(e){return{x1:e.x,y1:e.y,x2:e.x+e.width,y2:e.y+e.height}},expand(e,t){return t===0?e:{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}},shrink(e,t){return t===0?e:{x:e.x+t,y:e.y+t,width:e.width-t*2,height:e.height-t*2}},includes(e,t){return e===t?!0:e.x<=t.x&&e.y<=t.y&&e.x+e.width>=t.x+t.width&&e.y+e.height>=t.y+t.height}},$a={center({x1:e,y1:t,x2:n,y2:r}){return{x:(e+n)/2,y:(t+r)/2}},fromPoints(e){P(e.length>0,`At least one point is required`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.min(n,o),r=Math.max(r,a),i=Math.max(i,o);return{x1:t,y1:n,x2:r,y2:i}},merge(...e){P(e.length>0,`No boxes provided`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x1),n=Math.min(n,a.y1),r=Math.max(r,a.x2),i=Math.max(i,a.y2);return{x1:t,y1:n,x2:r,y2:i}},toBBox(e){return{x:e.x1,y:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}},includes(e,t){return e===t?!0:e.x1<=t.x1&&e.y1<=t.y1&&e.x2>=t.x2&&e.y2>=t.y2}};var eo=class e{constructor(e,t){this.x=e,this.y=t,P(typeof e==`number`&&!isNaN(e)&&isFinite(e)&&typeof t==`number`&&!isNaN(t)&&isFinite(t),`Invalid arguments for Vector: (${e}, ${t})`)}static create(...t){return t.length===2?new e(t[0],t[1]):new e(t[0].x,t[0].y)}static add(e,t){return{x:e.x+t.x,y:e.y+t.y}}static subtract(e,t){return{x:e.x-t.x,y:e.y-t.y}}static multiply(e,t){return{x:e.x*t,y:e.y*t}}static divide(e,t){return{x:e.x/t,y:e.y/t}}static dot(e,t){return e.x*t.x+e.y*t.y}add(t){return new e(this.x+t.x,this.y+t.y)}subtract(t){return new e(this.x-t.x,this.y-t.y)}multiply(t){return new e(this.x*t,this.y*t)}divide(t){return new e(this.x/t,this.y/t)}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}length(){return this.x===0&&this.y===0?0:Math.sqrt(this.x**2+this.y**2)}normalize(){let t=this.length();return t===0?new e(0,0):new e(this.x/t,this.y/t)}round(){return new e(Math.round(this.x),Math.round(this.y))}trunc(){return new e(Math.trunc(this.x),Math.trunc(this.y))}toObject(){return{x:this.x,y:this.y}}};function to(e,t){return e[no]===t}const no=`_stage`,ro=`_type`,io=`_layout`;function ao(e){return e}function oo(e){return typeof e==`string`?{txt:e}:e}function so(e){if(An(e))return null;let t=sn(e)?e:e.txt??e.md;return b(t?.trim())?t:null}function co(e,t){return t?t+`.`+e:e}const lo=`@group`;function uo(e){return e.kind===lo}function fo(e){return e}function po(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function mo(e){return e.startsWith(`@`)}function ho(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function go(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function _o(e){return e.startsWith(`step-`)}function vo(e){if(!_o(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let V;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(sn(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return po(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(V||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&V.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(H||={});let yo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(yo||={});let bo;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return yo.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return yo.is(e)||yo.isWhere(e)||yo.isCustom(e)}e.isRelation=a})(bo||={});let U;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(U||={});let xo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(xo||={});let So;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return xo.isWhere(e)}e.isRelationWhere=n;function r(e){return U.isWhere(e)}e.isFqnExprWhere=r;function i(e){return U.is(e)||U.isWhere(e)||U.isCustom(e)}e.isFqnExpr=i;function a(e){return xo.is(e)||xo.isWhere(e)||xo.isCustom(e)}e.isRelationExpr=a})(So||={});function Co(e){return b(e.kind)&&!b(e.element)}function wo({size:e,padding:t,textSize:n,iconSize:r,...i},a=Qo.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function To(e){return`tag`in e}function Eo(e){return`kind`in e}function Do(e){return`participant`in e}function Oo(e){return`not`in e}function ko(e){return`and`in e}function Ao(e){return`or`in e}function jo(e){switch(!0){case Do(e):{let t=e.participant;return Mo(t,jo(e.operator))}case To(e):{if(sn(e.tag)||`eq`in e.tag){let t=sn(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case Eo(e):{if(sn(e.kind)||`eq`in e.kind){let t=sn(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>S(e.kind)||e.kind!==t}case Oo(e):return kt(jo(e.not));case ko(e):return fn(e.and.map(jo));case Ao(e):return _n(e.or.map(jo));default:F(e)}}function Mo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function No(e){return`include`in e||`exclude`in e}function Po(e){return`targets`in e&&`style`in e}function Fo(e){return e._type===`element`}function Io(e){return Fo(e)&&b(e.extends)}function Lo(e){return e._type===`deployment`}function Ro(e){return e._type===`dynamic`}function zo(e){return`styleId`in e}function Bo(e){return`predicateId`in e}function Vo(e){return e===`TB`||e===`BT`||e===`LR`||e===`RL`}function Ho(e){return`direction`in e}function Uo(e){return _o(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function Wo(e){return!!e&&`__parallel`in e&&Bt(e.__parallel)}function Go(e){return!!e&&`__series`in e&&Bt(e.__series)}function Ko(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function qo(e){return`rank`in e&&Array.isArray(e.targets)}const Jo=Symbol.for(`text`),Yo=Symbol.for(`html`);var Xo=class e{static mdcache=new Ln.default(500);static txtcache=new Ln.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Jo,()=>Wa(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Yo,()=>Ua(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function Zo(e,t){let n=t??6,r=Mn(e.fill),i=Mn(e.stroke),a=r.luminance()>.8,o=w(Sn(Mn.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),Mn.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),x(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Qo={theme:Ja,defaults:qa};var $o=class e{theme;defaults;static DEFAULT=new e(Qo);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=l({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},Qo);return An(r?.content)&&jt(o,Qo)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??=this.defaults.color)}compoundColorsCache=new Rn.default(e=>new Hn.default(t=>Zo(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=wo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!Mn.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return Ga(e)}equals(e){return e===this?!0:this.constructor===e.constructor?jt(this.config,e.config)&&jt(this.customCss??null,e.customCss??null):!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:qi(e)?this.computeFrom(Ki[e]).elements:this.computeFrom(e).elements}};const es=y.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),ts=y.enum(Ui).meta({id:`ElementShape`}),ns=y.enum(Hi).meta({id:`BorderStyle`}),rs=y.enum(Bi).meta({id:`ElementSize`}),is=y.enum(Vi).meta({id:`IconPosition`}),as=y.enum(Ya).meta({id:`ArrowType`}),os=y.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),ss=y.enum(Wi).meta({id:`ThemeColorName`}),cs=y.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),ls=ss.or(cs).transform(e=>e).meta({id:`ColorName`}),us=y.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),ds=y.strictObject({fill:us.meta({description:`Background color`}),stroke:us.meta({description:`Stroke color (border, paths above background)`}),hiContrast:us.meta({description:`High contrast text color (title)`}),loContrast:us.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),fs=y.strictObject({line:us.meta({description:`Line color`}),label:us.meta({description:`Label text color`}),labelBg:us.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),ps=y.strictObject({elements:ds.or(us.transform(e=>Ga(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:fs.or(us.transform(e=>Ga(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(us.transform(e=>Ga(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),ms=y.partialRecord(ls,ps).transform(e=>e),hs=y.strictObject({width:y.number().min(50),height:y.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),gs=y.partialRecord(rs,hs),_s=y.strictObject({colors:ms.optional().meta({description:`Override theme colors`}),sizes:gs.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>B({colors:e?B(e):void 0,sizes:t?B(t):void 0})),vs=y.strictObject({color:ls.optional().meta({description:`Default color for groups
15
+ (must be a valid color name from the theme)`}),opacity:es.optional().meta({description:`Default opacity for groups`}),border:ns.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),ys=y.strictObject({color:ls.optional().meta({description:`Default color for relationships
16
+ (must be a valid color name from the theme)`}),line:os.optional().meta({description:`Default line style for relationships`}),arrow:as.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
17
+ These values will be used if such property is not defined`}),bs=y.strictObject({color:ls.optional().meta({description:`Default color for elements
18
+ (must be a valid color name from the theme)`}),opacity:es.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:ns.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:rs.optional().meta({description:`Default size for elements`}),shape:ts.optional().meta({description:`Default shape for elements`}),iconPosition:is.optional().meta({description:`Default icon position for elements`}),group:vs.optional().meta({description:`Override default values for group style properties
19
+ These values will be used if such property is not defined`}),relationship:ys.optional().meta({description:`Override default values for relationship style properties
20
+ These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),xs=y.union([y.string().min(1,`Custom CSS file path cannot be empty`),y.array(y.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),Ss=y.strictObject({theme:_s.optional().meta({description:`Project theme customization`}),defaults:bs.optional().meta({description:`Override default values for style properties
21
+ These values will be used if such property is not defined`}),customCss:xs.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>B({defaults:Cs(t),customCss:ws(n),theme:e}));function Cs(e){if(!e)return;let{relationship:t,group:n,...r}=e;return B({...r,relationship:t&&B(t),group:n&&B(n)})}function ws(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const Ts=y.strictObject({outDir:y.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
22
+ `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),Es=y.object({name:y.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),extends:y.union([y.string().min(1,`Extend path cannot be empty`),y.array(y.string().min(1,`Extend path cannot be empty`)).min(1,`Extend list cannot be empty`)]).optional().meta({description:`Extend styles from other config files`}),title:y.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:y.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),metadata:y.record(y.string(),y.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:Ss.optional().meta({description:`Project styles customization`}),imageAliases:Di.optional(),include:ki.optional(),exclude:y.array(y.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:Ts.optional(),inferTechnologyFromIcon:y.boolean().optional().meta({description:[`Automatically derive element technology from icon name when technology is not set explicitly.`,`Applies to aws:, azure:, gcp:, and tech: icons. Bootstrap icons are excluded.`,`Defaults to true.`].join(`
23
+ `)}),implicitViews:y.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to true.`})}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),Ds=y.instanceof(Function),Os=y.record(y.string(),Ds),ks=Es.extend({generators:Os.optional()});function As(e){let t=ks.safeParse(e);if(t.success)return t.data;throw Error(`Config validation failed:
24
+ `+y.prettifyError(t.error))}function js(e){return As(rt.parse(e.trim()||`{}`))}const Ms={parse:js,validate:As,normalizeInclude:e=>{let t=ki.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function Ns(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function Ps(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function Fs(e){let t=Ns(e),n=Ps(t);return n[n.length-1]||t}const Is=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],Ls=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...Is,...Ls];function Rs(e){return Is.includes(Fs(e))}function zs(e){return Ls.includes(Fs(e))}function Bs(e){return Rs(e)||zs(e)}function Vs(e){return w(e,D(e=>!!e.notation),At(T(`notation`)),zt(Kt(At(T(`shape`)),zt(Kt(At(T(`color`)),zt(Kt(x(T(`kind`)),qt())),on(),x(([e,t])=>({kinds:t,color:e})))),on(),C(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),on(),C(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),wn(T(`shape`),T(`title`),[e=>e.kinds.length,`desc`]))}const Hs=(e,t)=>e===t||S(e)&&S(t)?!1:!jt(e,t);function Us(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],S(t.style.border)?delete e.style.border:e.style.border=t.style.border,It(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,S(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function Ws(e,t,n){if(Hs(t.icon??`none`,e.icon??`none`)){let r=b(e.icon)&&e.icon!==`none`;switch(!0){case r&&b(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(S(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&b(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Gs(e,t,n){let r=!0;return Hs(e.style.iconColor,t.style.iconColor)&&(S(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),Hs(e.style.iconSize,t.style.iconSize)&&(n?S(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),Hs(e.style.iconPosition,t.style.iconPosition)&&(n?S(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Ks(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function qs(e,t,n){let r=!0;return Hs(e.title,t.title)&&(n?e.title=t.title:r=!1),Hs(e.description,t.description)&&(S(t.description)?delete e.description:n?e.description=Ks(e.description,t.description):r=!1),Hs(e.technology,t.technology)&&(S(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Js(e,t,n){return e.title=t.title,S(t.description)?delete e.description:e.description=Ks(e.description,t.description),S(t.technology)?delete e.technology:e.technology=t.technology,!0}function Ys(e,t){P(e.id===t.id,`applyManualLayout: view ids do not match`),P(e._stage===`layouted`,`applyManualLayout: expected layouted view`),P(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),P(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Xs(t.nodes,e.nodes,n),i=Zs(t.edges,e.edges,n),a=Vs(r);return er(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[io]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=tr(r),o.edges=tr(i),Ro(e)&&o._type===`dynamic`&&(o.variant=e.variant),Fo(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];E(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Xs(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),er(e,r=>{Us(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(Hs(r.modelRef,t.modelRef)||Hs(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),Hs(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;Hs(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Gs(r,t,s)||i.add(`label-changed`),Ws(r,t,s&&o===a)||i.add(`label-changed`),(a?Js:qs)(r,t,s)||i.add(`label-changed`),Hs(r.notes,t.notes)&&(S(t.notes)?delete r.notes:r.notes=Ks(r.notes,t.notes)),Hs(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&Ra(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];E(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Zs(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??w(r.values(),ba(t=>t.source===e.source&&t.target===e.target),wa());return t&&r.delete(t.id),er(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:Hs(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:P(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),P(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),P(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),Hs(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,Hs(e.notes,t.notes)&&(S(e.notes)!==S(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,Hs(kn(e,[`label`,`description`,`technology`,`labelBBox`]),kn(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),Hs(e.label,t.label)&&(S(t.label)!==S(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),Hs(e.description,t.description)&&(S(t.description)!==S(e.description)&&i.add(`label-changed`),t.description&&(r.description=Ks(e.description,t.description))),Hs(e.technology,t.technology)&&(S(t.technology)!==S(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:P(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),P(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];E(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function Qs(e,t){let{drifts:n,...r}=Ys(e,t);if(!n||n.length===0)return er(e,e=>{delete e.drifts,e[io]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),er(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??w(o.values(),ba(t=>t.source===e.source&&t.target===e.target),wa());return t&&o.delete(t.id),er(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return er(e,e=>{E(l,1)?e.drifts=l:delete e.drifts,e.nodes=tr(s),e.edges=tr(c),e[io]=`auto`})}const $s=Es.pick({extends:!0,styles:!0}).loose(),ec=e=>e?Array.isArray(e)?e:[e]:[],tc=async e=>{let t=await ei.readFile(e,`utf-8`),n;try{n=rt.parse(t.trim()||`{}`)}catch(t){throw li(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=$s.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+y.prettifyError(r.error));return r.data},nc=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await tc(e),r=ec(n.extends),i=[...t,e],a=[];for(let t of r){let n=Zr(Xr(e),t);a.push(...await nc(n,i))}return[...a,n]};async function rc(e){e=typeof e==`string`?e:e.fsPath,bi.getChild(`config`).debug`Loading config: ${e}`;let t=Xr(e),n=Yr(e),r={name:Yr(t)};if(Rs(n)){let t=await nc(Zr(e),[]);P(E(t,1),`Expect at least one config`);let n=Dn(Ft(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(Mt),a=i.length>0?l({},...i.reverse()):void 0;return As({...r,...n,...a?{styles:a}:{}})}P(zs(n),`Invalid name for config file: ${e}`);let{mod:i}=await Qr({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=$r(e.errors,{kind:`error`});for(let e of t)bi.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
23
25
  // Mock implementation to allow loading config files without bundling @likec4/config
24
26
  function mock(x) { return x }
25
27
  export {
@@ -28,13 +30,224 @@ export {
28
30
  mock as defineStyle,
29
31
  mock as defineTheme,
30
32
  mock as defineThemeColor,
31
- }`,loader:`js`}))}}]}});return _s(n?.default??n)}catch(n){throw t.error(`Failed to load config file: ${e.fsPath}`,{err:n}),n}}const js=[`likec4lib {`,` icons {`,...[...Object.entries({aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
32
- `),Ms=`likec4builtin`,Ns=`${Ms}:///likec4/lib/icons.c4`;function Ps(e){return e.scheme===Ms}const W=ei.getChild(`server`);function G(e){W.warn(M(e))}Xe();const Fs=W.getChild(`manual-layouts`),Is=e=>e.endsWith(`.likec4.snap`);function Ls(e){return`${e}.likec4.snap`}function Rs(e){return se.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const zs={manualLayouts:e=>new Vs(e)},Bs=`file://./`;var Vs=class{cache;constructor(e){this.services=e,this.cache=new Ze(e,m.Validated)}async read(e){return await this.cache.get(e.id,async()=>{let t=Fs.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=Rs(e),i=[];try{let a=await n.scanDirectory(r,Is);if(a.length===0)return null;for(let r of a)if(r.isFile)try{let t=await n.readFile(r.uri),a=nt.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.debug`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}return i.length===0?null:jt(i,E(`id`))})}async write(e,t){let n=Fs.getChild(e.id),r=Rs(e),i=se.joinPath(r,Ls(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=nt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:xe.create(Me.create(0,0),Me.create(a.split(`
33
+ }`,loader:`js`}))}}]}});return As(Object.assign(r,i?.default??i))}var ic=rr();const ac=[`likec4lib {`,` icons {`,...[...Object.entries({aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
34
+ `),oc=`likec4builtin`,sc=`${oc}:///likec4/lib/icons.c4`;function cc(e){return(`uri`in e?e.uri:e).scheme===oc}function lc(e){return!cc(e)}const W=bi.getChild(`server`);function G(e){W.warn(ci(e))}De();const uc=W.getChild(`manual-layouts`),dc=e=>e.endsWith(`.likec4.snap`);function fc(e){return`${e}.likec4.snap`}function pc(e){return le.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const mc={manualLayouts:e=>new gc(e)},hc=`file://./`;var gc=class{cache;constructor(e){this.services=e,this.cache=new tt,Na(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async read(e){return await this.cache.get(e.id,async()=>{let t=uc.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=pc(e),i=[];try{let a=await n.scanDirectory(r,dc);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=rt.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.debug`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=Ht(i,T(`id`));return{hash:Ba(a),views:a}})}async write(e,t){let n=uc.getChild(e.id),r=pc(e),i=le.joinPath(r,fc(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=rt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:Ve.create(Se.create(0,0),Se.create(a.split(`
33
35
  `).length-1,1))};n.debug`write snapshot of ${t.id} in project ${e.id} to ${i.fsPath}`;let s=this.services.workspace.FileSystemProvider;try{await s.writeFile(i,a+`
34
- `)}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}let c=this.cache.get(e.id);if(c){let r=await c;r?(n.debug`update snapshot cache of ${t.id} in project ${e.id}`,r[t.id]=t):(n.debug`clean cache of project ${e.id}`,this.cache.delete(e.id))}return o}async remove(e,t){let n=Fs.getChild(e.id),r=Rs(e),i=se.joinPath(r,Ls(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:xe.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}let o=this.cache.get(e.id);if(o){let r=await o;r?(n.debug`clean cached view ${t} in project ${e.id}`,delete r[t]):(n.debug`reset empty cache of project ${e.id}`,this.cache.delete(e.id))}return a}clearCaches(){Fs.debug`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=_.parse(e.icon),r=se.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${Bs}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(Bs)){let n=e.icon.substring(9),r=se.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const Hs=`AnyProperty`;function Us(e){return K.isInstance(e,Hs)}const Ws=`ColorLiteral`;function Gs(e){return K.isInstance(e,Ws)}const Ks=`DeploymentElement`;function qs(e){return K.isInstance(e,Ks)}const Js=`DeploymentNodeOrElementKind`,Ys=`DeploymentViewRule`;function Xs(e){return K.isInstance(e,Ys)}const Zs=`DynamicViewProperty`,Qs=`DynamicViewRule`;function $s(e){return K.isInstance(e,Qs)}const ec=`DynamicViewStep`;function tc(e){return K.isInstance(e,ec)}const nc=`ElementProperty`;function rc(e){return K.isInstance(e,nc)}const ic=`ExpressionV2`;function ac(e){return K.isInstance(e,ic)}const oc=`ExtendElementProperty`,sc=`ExtendRelationProperty`,cc=`FqnExpr`;function lc(e){return K.isInstance(e,cc)}const uc=`FqnExprOrWhere`;function dc(e){return K.isInstance(e,uc)}const fc=`FqnExprOrWith`;function pc(e){return K.isInstance(e,fc)}const mc=`FqnReferenceable`,hc=`LikeC4View`;function gc(e){return K.isInstance(e,hc)}const _c=`MetadataProperty`;function vc(e){return K.isInstance(e,_c)}const yc=`MetadataValue`,bc=`ModelReferenceable`,xc=`Referenceable`,Sc=`RelationExpr`;function Cc(e){return K.isInstance(e,Sc)}const wc=`RelationExprOrWhere`;function Tc(e){return K.isInstance(e,wc)}const Ec=`RelationExprOrWith`;function Dc(e){return K.isInstance(e,Ec)}const Oc=`RelationProperty`,kc=`RelationshipStyleProperty`;function Ac(e){return K.isInstance(e,kc)}const jc=`SizeProperty`;function Mc(e){return K.isInstance(e,jc)}const Nc=`StringProperty`;function Pc(e){return K.isInstance(e,Nc)}const Fc=`StyleProperty`;function Ic(e){return K.isInstance(e,Fc)}const Lc=`ViewProperty`;function Rc(e){return K.isInstance(e,Lc)}const zc=`ViewRule`;function Bc(e){return K.isInstance(e,zc)}const Vc=`ViewRuleStyleOrGlobalRef`;function Hc(e){return K.isInstance(e,Vc)}const Uc=`WhereElement`;function Wc(e){return K.isInstance(e,Uc)}const Gc=`WhereElementExpression`;function Kc(e){return K.isInstance(e,Gc)}const qc=`WhereExpression`,Jc=`WhereKindEqual`;function Yc(e){return K.isInstance(e,Jc)}const Xc=`WhereRelation`;function Zc(e){return K.isInstance(e,Xc)}const Qc=`WhereRelationExpression`;function $c(e){return K.isInstance(e,Qc)}const el=`WhereTagEqual`;function tl(e){return K.isInstance(e,el)}const nl=`AbstractDynamicStep`,rl=`ArrowProperty`;function il(e){return K.isInstance(e,rl)}const al=`BorderProperty`;function ol(e){return K.isInstance(e,al)}const sl=`ColorProperty`;function cl(e){return K.isInstance(e,sl)}const ll=`CustomColor`,ul=`CustomElementProperties`;function dl(e){return K.isInstance(e,ul)}const fl=`CustomRelationProperties`;function pl(e){return K.isInstance(e,fl)}const ml=`DeployedInstance`;function hl(e){return K.isInstance(e,ml)}const gl=`DeployedInstanceBody`;function _l(e){return K.isInstance(e,gl)}const vl=`DeploymentNode`;function yl(e){return K.isInstance(e,vl)}const bl=`DeploymentNodeBody`;function xl(e){return K.isInstance(e,bl)}const Sl=`DeploymentNodeKind`;function Cl(e){return K.isInstance(e,Sl)}const wl=`DeploymentRelation`;function Tl(e){return K.isInstance(e,wl)}const El=`DeploymentRelationBody`;function Dl(e){return K.isInstance(e,El)}const Ol=`DeploymentView`;function kl(e){return K.isInstance(e,Ol)}const Al=`DeploymentViewBody`;function jl(e){return K.isInstance(e,Al)}const Ml=`DeploymentViewRulePredicate`;function Nl(e){return K.isInstance(e,Ml)}const Pl=`DeploymentViewRuleStyle`;function Fl(e){return K.isInstance(e,Pl)}const Il=`DirectedRelationExpr`;function Ll(e){return K.isInstance(e,Il)}const Rl=`DynamicView`;function zl(e){return K.isInstance(e,Rl)}const Bl=`DynamicViewBody`;function Vl(e){return K.isInstance(e,Bl)}const Hl=`DynamicViewDisplayVariantProperty`;function Ul(e){return K.isInstance(e,Hl)}const Wl=`DynamicViewGlobalPredicateRef`;function Gl(e){return K.isInstance(e,Wl)}const Kl=`DynamicViewIncludePredicate`;function ql(e){return K.isInstance(e,Kl)}const Jl=`DynamicViewParallelSteps`;function Yl(e){return K.isInstance(e,Jl)}const Xl=`DynamicViewRef`,Zl=`Element`;function Ql(e){return K.isInstance(e,Zl)}const $l=`ElementBody`;function eu(e){return K.isInstance(e,$l)}const tu=`ElementKind`;function nu(e){return K.isInstance(e,tu)}const ru=`ElementKindExpression`;function iu(e){return K.isInstance(e,ru)}const au=`ElementRef`;function ou(e){return K.isInstance(e,au)}const su=`ElementStringProperty`;function cu(e){return K.isInstance(e,su)}const lu=`ElementStyleProperty`;function uu(e){return K.isInstance(e,lu)}const du=`ElementTagExpression`;function fu(e){return K.isInstance(e,du)}const pu=`ElementView`;function mu(e){return K.isInstance(e,pu)}const hu=`ElementViewBody`;function gu(e){return K.isInstance(e,hu)}const _u=`ElementViewRef`,vu=`Expressions`;function yu(e){return K.isInstance(e,vu)}const bu=`ExtendDeployment`;function xu(e){return K.isInstance(e,bu)}const Su=`ExtendDeploymentBody`;function Cu(e){return K.isInstance(e,Su)}const wu=`ExtendElement`;function Tu(e){return K.isInstance(e,wu)}const Eu=`ExtendElementBody`;function Du(e){return K.isInstance(e,Eu)}const Ou=`ExtendRelation`;function ku(e){return K.isInstance(e,Ou)}const Au=`ExtendRelationBody`,ju=`FqnExpressions`;function Mu(e){return K.isInstance(e,ju)}const Nu=`FqnExprWhere`;function Pu(e){return K.isInstance(e,Nu)}const Fu=`FqnExprWith`;function Iu(e){return K.isInstance(e,Fu)}const Lu=`FqnRef`;function Ru(e){return K.isInstance(e,Lu)}const zu=`FqnRefExpr`;function Bu(e){return K.isInstance(e,zu)}const Vu=`GlobalDynamicPredicateGroup`;function Hu(e){return K.isInstance(e,Vu)}const Uu=`GlobalPredicateGroup`;function Wu(e){return K.isInstance(e,Uu)}const Gu=`Globals`;function Ku(e){return K.isInstance(e,Gu)}const qu=`GlobalStyle`;function Ju(e){return K.isInstance(e,qu)}const Yu=`GlobalStyleGroup`;function Xu(e){return K.isInstance(e,Yu)}const Zu=`GlobalStyleId`,Qu=`HexColor`;function $u(e){return K.isInstance(e,Qu)}const ed=`IconColorProperty`;function td(e){return K.isInstance(e,ed)}const nd=`IconPositionProperty`;function rd(e){return K.isInstance(e,nd)}const id=`IconProperty`;function ad(e){return K.isInstance(e,id)}const od=`IconSizeProperty`;function sd(e){return K.isInstance(e,od)}const cd=`Imported`;function ld(e){return K.isInstance(e,cd)}const ud=`ImportsFromPoject`;function dd(e){return K.isInstance(e,ud)}const fd=`IncomingRelationExpr`;function pd(e){return K.isInstance(e,fd)}const md=`InOutRelationExpr`;function hd(e){return K.isInstance(e,md)}const gd=`LibIcon`;function _d(e){return K.isInstance(e,gd)}const vd=`LikeC4Grammar`;function yd(e){return K.isInstance(e,vd)}const bd=`LikeC4Lib`;function xd(e){return K.isInstance(e,bd)}const Sd=`LineProperty`;function Cd(e){return K.isInstance(e,Sd)}const wd=`LinkProperty`;function Td(e){return K.isInstance(e,wd)}const Ed=`MarkdownOrString`;function Dd(e){return K.isInstance(e,Ed)}const Od=`MetadataArray`;function kd(e){return K.isInstance(e,Od)}const Ad=`MetadataAttribute`;function jd(e){return K.isInstance(e,Ad)}const Md=`MetadataBody`;function Nd(e){return K.isInstance(e,Md)}const Pd=`Model`;function Fd(e){return K.isInstance(e,Pd)}const Id=`ModelDeployments`;function Ld(e){return K.isInstance(e,Id)}const Rd=`ModelViews`;function zd(e){return K.isInstance(e,Rd)}const Bd=`MultipleProperty`;function Vd(e){return K.isInstance(e,Bd)}const Hd=`NavigateToProperty`;function Ud(e){return K.isInstance(e,Hd)}const Wd=`NotationProperty`;function Gd(e){return K.isInstance(e,Wd)}const Kd=`NotesProperty`;function qd(e){return K.isInstance(e,Kd)}const Jd=`OpacityProperty`;function Yd(e){return K.isInstance(e,Jd)}const Xd=`OutgoingRelationExpr`;function Zd(e){return K.isInstance(e,Xd)}const Qd=`PaddingSizeProperty`;function $d(e){return K.isInstance(e,Qd)}const ef=`Relation`;function tf(e){return K.isInstance(e,ef)}const nf=`RelationBody`;function rf(e){return K.isInstance(e,nf)}const af=`RelationExprWhere`;function of(e){return K.isInstance(e,af)}const sf=`RelationExprWith`;function cf(e){return K.isInstance(e,sf)}const lf=`RelationKindDotRef`;function uf(e){return K.isInstance(e,lf)}const df=`RelationNavigateToProperty`;function ff(e){return K.isInstance(e,df)}const pf=`RelationshipKind`;function mf(e){return K.isInstance(e,pf)}const hf=`RelationStringProperty`;function gf(e){return K.isInstance(e,hf)}const _f=`RelationStyleProperty`;function vf(e){return K.isInstance(e,_f)}const yf=`RGBAColor`;function bf(e){return K.isInstance(e,yf)}const xf=`ShapeProperty`;function Sf(e){return K.isInstance(e,xf)}const Cf=`ShapeSizeProperty`;function wf(e){return K.isInstance(e,Cf)}const Tf=`SpecificationColor`;function Ef(e){return K.isInstance(e,Tf)}const Df=`SpecificationDeploymentNodeKind`;function Of(e){return K.isInstance(e,Df)}const kf=`SpecificationElementKind`;function Af(e){return K.isInstance(e,kf)}const jf=`SpecificationElementStringProperty`;function Mf(e){return K.isInstance(e,jf)}const Nf=`SpecificationRelationshipKind`;function Pf(e){return K.isInstance(e,Nf)}const Ff=`SpecificationRelationshipStringProperty`;function If(e){return K.isInstance(e,Ff)}const Lf=`SpecificationRule`;function Rf(e){return K.isInstance(e,Lf)}const zf=`SpecificationTag`;function Bf(e){return K.isInstance(e,zf)}const Vf=`StrictFqnElementRef`;function Hf(e){return K.isInstance(e,Vf)}const Uf=`StrictFqnRef`;function Wf(e){return K.isInstance(e,Uf)}function Gf(e){return K.isInstance(e,`Tag`)}const Kf=`TagRef`;function qf(e){return K.isInstance(e,Kf)}const Jf=`Tags`;function Yf(e){return K.isInstance(e,Jf)}const Xf=`TextSizeProperty`;function Zf(e){return K.isInstance(e,Xf)}const Qf=`ViewRef`,$f=`ViewRuleAutoLayout`;function ep(e){return K.isInstance(e,$f)}const tp=`ViewRuleGlobalPredicateRef`;function np(e){return K.isInstance(e,tp)}const rp=`ViewRuleGlobalStyle`;function ip(e){return K.isInstance(e,rp)}const ap=`ViewRuleGroup`;function op(e){return K.isInstance(e,ap)}const sp=`ViewRulePredicate`;function cp(e){return K.isInstance(e,sp)}const lp=`ViewRuleRank`;function up(e){return K.isInstance(e,lp)}const dp=`ViewRuleStyle`;function fp(e){return K.isInstance(e,dp)}const pp=`ViewStringProperty`;function mp(e){return K.isInstance(e,pp)}const hp=`WhereBinaryExpression`;function gp(e){return K.isInstance(e,hp)}const _p=`WhereElementKind`;function vp(e){return K.isInstance(e,_p)}const yp=`WhereElementNegation`;function bp(e){return K.isInstance(e,yp)}const xp=`WhereElementTag`;function Sp(e){return K.isInstance(e,xp)}const Cp=`WhereRelationKind`;function wp(e){return K.isInstance(e,Cp)}const Tp=`WhereRelationNegation`;function Ep(e){return K.isInstance(e,Tp)}const Dp=`WhereRelationParticipantKind`;function Op(e){return K.isInstance(e,Dp)}const kp=`WhereRelationParticipantTag`;function Ap(e){return K.isInstance(e,kp)}const jp=`WhereRelationTag`;function Mp(e){return K.isInstance(e,jp)}const Np=`WildcardExpression`;function Pp(e){return K.isInstance(e,Np)}const Fp=`DynamicStepChain`;function Ip(e){return K.isInstance(e,Fp)}const Lp=`DynamicStepSingle`;function Rp(e){return K.isInstance(e,Lp)}var zp=class extends ve{getAllTypes(){return[nl,Hs,rl,al,Ws,sl,ll,ul,fl,ml,gl,Ks,vl,bl,Sl,Js,wl,El,Ol,Al,Ys,Ml,Pl,Il,Fp,Lp,Rl,Bl,Hl,Wl,Kl,Jl,Zs,Xl,Qs,ec,Zl,$l,tu,ru,nc,au,su,lu,du,pu,hu,_u,ic,vu,bu,Su,wu,Eu,oc,Ou,Au,sc,cc,uc,fc,Nu,Fu,ju,Lu,zu,mc,Vu,Uu,qu,Yu,Zu,Gu,Qu,ed,nd,id,od,cd,ud,md,fd,gd,vd,bd,hc,Sd,wd,Ed,Od,Ad,Md,_c,yc,Pd,Id,bc,Rd,Bd,Hd,Wd,Kd,Jd,Xd,Qd,yf,xc,ef,nf,Sc,wc,Ec,af,sf,lf,df,Oc,hf,_f,pf,kc,xf,Cf,jc,Tf,Df,kf,jf,Nf,Ff,Lf,zf,Vf,Uf,Nc,Fc,`Tag`,Kf,Jf,Xf,Lc,Qf,zc,$f,tp,rp,ap,sp,lp,dp,Vc,pp,hp,Uc,Gc,_p,yp,xp,qc,Jc,Xc,Qc,Cp,Tp,Dp,kp,jp,el,Np]}computeIsSubtype(e,t){switch(e){case rl:case Sd:return this.isSubtype(kc,t);case al:case ed:case nd:case Bd:case Jd:case xf:return this.isSubtype(Fc,t);case sl:return this.isSubtype(kc,t)||this.isSubtype(Fc,t);case ml:case vl:return this.isSubtype(Ks,t)||this.isSubtype(xc,t);case Sl:case tu:return this.isSubtype(Js,t);case Ol:case Rl:case pu:return this.isSubtype(hc,t);case Ml:case Pl:return this.isSubtype(Ys,t);case Il:case fd:case md:case Xd:return this.isSubtype(Sc,t);case Fp:case Lp:return this.isSubtype(nl,t)||this.isSubtype(ec,t);case Hl:return this.isSubtype(Zs,t);case Wl:case Kl:return this.isSubtype(Qs,t);case Zs:case nc:case Oc:case Nc:return this.isSubtype(Hs,t);case Zl:return this.isSubtype(mc,t)||this.isSubtype(bc,t)||this.isSubtype(xc,t);case ru:case du:case zu:case Np:return this.isSubtype(cc,t);case su:return this.isSubtype(nc,t)||this.isSubtype(Nc,t);case lu:return this.isSubtype(nc,t);case bu:case wu:case xc:return this.isSubtype(mc,t);case cc:case Nu:return this.isSubtype(uc,t);case uc:case Fu:return this.isSubtype(fc,t);case fc:case Ec:return this.isSubtype(ic,t);case Qu:case yf:return this.isSubtype(Ws,t);case id:return this.isSubtype(nc,t)||this.isSubtype(Fc,t);case od:case Qd:case Cf:case Xf:return this.isSubtype(jc,t)||this.isSubtype(Fc,t);case cd:return this.isSubtype(bc,t)||this.isSubtype(xc,t);case wd:return this.isSubtype(nc,t)||this.isSubtype(oc,t)||this.isSubtype(sc,t)||this.isSubtype(Oc,t)||this.isSubtype(Lc,t);case Ed:case Od:return this.isSubtype(yc,t);case Ad:case Wd:case Kd:case jf:case Ff:return this.isSubtype(Nc,t);case Md:return this.isSubtype(_c,t);case _c:return this.isSubtype(nc,t)||this.isSubtype(oc,t)||this.isSubtype(sc,t)||this.isSubtype(Oc,t);case Sc:case af:return this.isSubtype(wc,t);case wc:case sf:return this.isSubtype(Ec,t);case df:case _f:return this.isSubtype(Oc,t);case hf:return this.isSubtype(Oc,t)||this.isSubtype(Nc,t);case Lc:return this.isSubtype(Hs,t)||this.isSubtype(Zs,t);case $f:return this.isSubtype(Ys,t)||this.isSubtype(Qs,t)||this.isSubtype(zc,t);case tp:case ap:case sp:case lp:return this.isSubtype(zc,t);case rp:case dp:return this.isSubtype(Vc,t);case Vc:return this.isSubtype(Qs,t)||this.isSubtype(zc,t);case pp:return this.isSubtype(Nc,t)||this.isSubtype(Lc,t);case hp:return this.isSubtype(Gc,t)||this.isSubtype(Qc,t);case Uc:case yp:return this.isSubtype(Gc,t);case Gc:case Qc:return this.isSubtype(qc,t);case _p:return this.isSubtype(Uc,t)||this.isSubtype(Jc,t);case xp:return this.isSubtype(Uc,t)||this.isSubtype(el,t);case Xc:case Tp:return this.isSubtype(Qc,t);case Cp:case Dp:return this.isSubtype(Jc,t)||this.isSubtype(Xc,t);case kp:case jp:return this.isSubtype(Xc,t)||this.isSubtype(el,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return pf;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return ll;case`DeploymentNode:kind`:return Sl;case`DynamicViewGlobalPredicateRef:predicate`:return Vu;case`DynamicViewRef:view`:return Rl;case`Element:kind`:case`ElementKindExpression:kind`:return tu;case`ElementViewRef:view`:return pu;case`FqnRef:value`:case`StrictFqnRef:value`:return xc;case`IconProperty:libicon`:return gd;case`Imported:imported`:case`StrictFqnElementRef:el`:return Zl;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return hc;case`ViewRuleGlobalPredicateRef:predicate`:return Uu;case`ViewRuleGlobalStyle:style`:return Zu;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Js;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case nl:return{name:nl,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case rl:return{name:rl,properties:[{name:`key`},{name:`value`}]};case al:return{name:al,properties:[{name:`key`},{name:`value`}]};case sl:return{name:sl,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case ll:return{name:ll,properties:[{name:`name`}]};case ul:return{name:ul,properties:[{name:`props`,defaultValue:[]}]};case fl:return{name:fl,properties:[{name:`props`,defaultValue:[]}]};case ml:return{name:ml,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case gl:return{name:gl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case vl:return{name:vl,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case bl:return{name:bl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Sl:return{name:Sl,properties:[{name:`name`}]};case wl:return{name:wl,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case El:return{name:El,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ol:return{name:Ol,properties:[{name:`body`},{name:`name`}]};case Al:return{name:Al,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Ml:return{name:Ml,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Pl:return{name:Pl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Il:return{name:Il,properties:[{name:`source`},{name:`target`}]};case Rl:return{name:Rl,properties:[{name:`body`},{name:`name`}]};case Bl:return{name:Bl,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case Hl:return{name:Hl,properties:[{name:`key`},{name:`value`}]};case Wl:return{name:Wl,properties:[{name:`predicate`}]};case Kl:return{name:Kl,properties:[{name:`exprs`}]};case Jl:return{name:Jl,properties:[{name:`steps`,defaultValue:[]}]};case Xl:return{name:Xl,properties:[{name:`view`}]};case Zl:return{name:Zl,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case $l:return{name:$l,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case tu:return{name:tu,properties:[{name:`name`}]};case ru:return{name:ru,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case au:return{name:au,properties:[{name:`modelElement`}]};case su:return{name:su,properties:[{name:`key`},{name:`value`}]};case lu:return{name:lu,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case du:return{name:du,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case pu:return{name:pu,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case hu:return{name:hu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`view`}]};case vu:return{name:vu,properties:[{name:`prev`},{name:`value`}]};case bu:return{name:bu,properties:[{name:`body`},{name:`deploymentNode`}]};case Su:return{name:Su,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case wu:return{name:wu,properties:[{name:`body`},{name:`element`}]};case Eu:return{name:Eu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Ou:return{name:Ou,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Au:return{name:Au,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ju:return{name:ju,properties:[{name:`prev`},{name:`value`}]};case Nu:return{name:Nu,properties:[{name:`subject`},{name:`where`}]};case Fu:return{name:Fu,properties:[{name:`custom`},{name:`subject`}]};case Lu:return{name:Lu,properties:[{name:`parent`},{name:`value`}]};case zu:return{name:zu,properties:[{name:`ref`},{name:`selector`}]};case Vu:return{name:Vu,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Uu:return{name:Uu,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Gu:return{name:Gu,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case qu:return{name:qu,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Yu:return{name:Yu,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Zu:return{name:Zu,properties:[{name:`name`}]};case Qu:return{name:Qu,properties:[{name:`hex`}]};case ed:return{name:ed,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case nd:return{name:nd,properties:[{name:`key`},{name:`value`}]};case id:return{name:id,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case od:return{name:od,properties:[{name:`key`},{name:`value`}]};case cd:return{name:cd,properties:[{name:`imported`},{name:`prev`}]};case ud:return{name:ud,properties:[{name:`imports`},{name:`project`}]};case fd:return{name:fd,properties:[{name:`to`}]};case md:return{name:md,properties:[{name:`inout`}]};case gd:return{name:gd,properties:[{name:`name`}]};case vd:return{name:vd,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case bd:return{name:bd,properties:[{name:`icons`,defaultValue:[]}]};case Sd:return{name:Sd,properties:[{name:`key`},{name:`value`}]};case wd:return{name:wd,properties:[{name:`key`},{name:`title`},{name:`value`}]};case Ed:return{name:Ed,properties:[{name:`markdown`},{name:`text`}]};case Od:return{name:Od,properties:[{name:`values`,defaultValue:[]}]};case Ad:return{name:Ad,properties:[{name:`key`},{name:`value`}]};case Md:return{name:Md,properties:[{name:`props`,defaultValue:[]}]};case Pd:return{name:Pd,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Id:return{name:Id,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Rd:return{name:Rd,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Bd:return{name:Bd,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Hd:return{name:Hd,properties:[{name:`key`},{name:`value`}]};case Wd:return{name:Wd,properties:[{name:`key`},{name:`value`}]};case Kd:return{name:Kd,properties:[{name:`key`},{name:`value`}]};case Jd:return{name:Jd,properties:[{name:`key`},{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Qd:return{name:Qd,properties:[{name:`key`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case nf:return{name:nf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case af:return{name:af,properties:[{name:`subject`},{name:`where`}]};case sf:return{name:sf,properties:[{name:`custom`},{name:`subject`}]};case lf:return{name:lf,properties:[{name:`kind`}]};case df:return{name:df,properties:[{name:`key`},{name:`value`}]};case pf:return{name:pf,properties:[{name:`name`}]};case hf:return{name:hf,properties:[{name:`key`},{name:`value`}]};case _f:return{name:_f,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case yf:return{name:yf,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case xf:return{name:xf,properties:[{name:`key`},{name:`value`}]};case Cf:return{name:Cf,properties:[{name:`key`},{name:`value`}]};case Tf:return{name:Tf,properties:[{name:`color`},{name:`name`}]};case Df:return{name:Df,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case kf:return{name:kf,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case jf:return{name:jf,properties:[{name:`key`},{name:`value`}]};case Nf:return{name:Nf,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case Ff:return{name:Ff,properties:[{name:`key`},{name:`value`}]};case Lf:return{name:Lf,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case zf:return{name:zf,properties:[{name:`color`},{name:`tag`}]};case Vf:return{name:Vf,properties:[{name:`el`},{name:`parent`}]};case Uf:return{name:Uf,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Kf:return{name:Kf,properties:[{name:`tag`}]};case Jf:return{name:Jf,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Xf:return{name:Xf,properties:[{name:`key`},{name:`value`}]};case Qf:return{name:Qf,properties:[{name:`view`}]};case $f:return{name:$f,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case tp:return{name:tp,properties:[{name:`predicate`}]};case rp:return{name:rp,properties:[{name:`style`}]};case ap:return{name:ap,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case sp:return{name:sp,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case lp:return{name:lp,properties:[{name:`targets`},{name:`value`}]};case dp:return{name:dp,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case pp:return{name:pp,properties:[{name:`key`},{name:`value`}]};case hp:return{name:hp,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case _p:return{name:_p,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case yp:return{name:yp,properties:[{name:`value`}]};case xp:return{name:xp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Cp:return{name:Cp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Tp:return{name:Tp,properties:[{name:`value`}]};case Dp:return{name:Dp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case kp:return{name:kp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case jp:return{name:jp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Np:return{name:Np,properties:[{name:`isWildcard`,defaultValue:!1}]};case Fp:return{name:Fp,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Lp:return{name:Lp,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const K=new zp;let Bp;const Vp=()=>Bp??=Le(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@123"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/[_]*[a-zA-Z][-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),Hp={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Up={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Wp={AstReflection:()=>new zp},Gp={Grammar:()=>Vp(),LanguageMetaData:()=>Hp,parser:{ParserConfig:()=>Up}};function Kp(e,t=!1){return!t&&Hp.fileExtensions.some(t=>e.endsWith(t))}function qp(e,t){return!t&&gs(e)}function Jp(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const Yp=Mi(`/`);function Xp(e,t){return Yp(e.uri.path,t.uri.path)}const Zp=W.getChild(`chokidar`),Qp={fileSystemWatcher:e=>new em(e)},$p=e=>Kp(e)||gs(e)||Is(e);var em=class{watcher;queue=new Jn({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Zp.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){Zp.debug`create watcher for folder: ${e}`;let t=qn.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t&&t.isFile()&&!$p(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Zp.warn(`Failed on ${e}`,{error:t})}}).catch(t=>{Zp.error(`Error on ${e}`,{error:t})})}async onAddOrChange(e){let t=this.services.workspace;switch(!0){case gs(e):Zp.debug`project file changed: ${e}`,await t.ProjectsManager.registerConfigFile(_.file(e));break;case Kp(e):Zp.debug`file changed: ${e}`,await t.DocumentBuilder.update([_.file(e)],[]);break;case Is(e):{Zp.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.belongsTo(_.file(e));await t.ProjectsManager.rebuidProject(n);break}default:Zp.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace;switch(!0){case gs(e):Zp.debug`project file removed: ${e}`,await t.ProjectsManager.reloadProjects();break;case Kp(e):Zp.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[_.file(e)]);break;case Is(e):{Zp.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.belongsTo(e);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuidProject(n);break}default:Zp.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Zp.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findAllProjectsByFolder(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},tm=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(Ps(e))return Promise.resolve(js);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},nm=class{watch(){}dispose(){return Promise.resolve()}},rm=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const im={fileSystemWatcher:()=>new nm},am={fileSystemProvider:()=>new tm,...im},om={manualLayouts:()=>new rm};var sm=Kn();const cm=W.getChild(`filesystem`),lm=(e=!0)=>({fileSystemProvider:()=>new um,...e?Qp:im});var um=class extends Je{async readFile(e){if(Ps(e))return Promise.resolve(js);try{return await super.readFile(e)}catch(t){return cm.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new sm.fdir().withSymlinks({resolvePaths:!1}).exclude(Jp).filter(Kp).withFullPaths();n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:_.file(e)})}catch(t){cm.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(Xp)}async scanProjectFiles(e){return await this.scanDirectory(e,qp)}async scanDirectory(e,t){let n=[];try{let r=await new sm.fdir().withSymlinks({resolvePaths:!1}).withFullPaths().filter(t).exclude(Jp).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:_.file(e)})}catch(t){cm.warn(`Failed to scan directory ${e.fsPath}`,{error:t})}return n.sort(Xp)}async loadProjectConfig(e){return await As(e)}async writeFile(e,t){let n=Mr(e.fsPath),r=await Ir(n).catch(()=>null);if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(cm.debug(`creating directory {path}`,{path:n}),zr(n,{recursive:!0})),cm.debug(`writing file {path}`,{path:e.fsPath}),await Rr(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=await Ir(t);if(n.isFile()||n.isSymbolicLink())return await Lr(t),cm.debug(`deleted file {path}`,{path:t}),!0;cm.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t})}catch(t){cm.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const dm=W.getChild(`mcp`);function fm(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},pm(n,e,t)]}function pm(e,t,n){let r=n.bind(null,t);return(async function(t,n){dm.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return dm.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:M(t)}],isError:!0}}})}var mm=`1.48.0`,hm=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=Ja(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=Ui(r)):(this.imported=null,this.hierarchyLevel=Ui(this.id))}get name(){return zi(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>Rt([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!Xt(this.$element.summary,this.$element.description)}get summary(){return Ao.memoize(this,`summary`,ja(this.$element))}get description(){return Ao.memoize(this,`description`,Ma(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>aa(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Gi(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?Qi([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return D(aa(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!A(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},gm=class{Aux;get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,...this.$node.style}))}get name(){return zi(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Ao.memoize(this,`summary`,ja(this.$node))}get description(){return Ao.memoize(this,`description`,Ma(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Gi(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>xm.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>xm.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!A(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},_m=class extends gm{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=Ui(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get tags(){return R(this,Symbol.for(`tags`),()=>Rt([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=aa(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return _a(t,e)}},vm=class extends gm{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=Ui(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>Rt([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get summary(){return Ao.memoize(this,`summary`,ja(this.$instance)??ja(this.element.$element))}get description(){return Ao.memoize(this,`description`,Ma(this.$instance)??Ma(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},ym=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},bm=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=Gi(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return D(this.$relationship.title)?this.$relationship.title:null}get technology(){return Ot(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Xt(this.$relationship.summary,this.$relationship.description)}get summary(){return Ao.memoize(this,`summary`,ja(this.$relationship))}get description(){return Ao.memoize(this,`description`,Ma(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!A(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},xm=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(_a(this.model,t.model),_a(this.deployment,t.deployment))}difference(t){return e.from(z(this.model,t.model),z(this.deployment,t.deployment))}union(t){return e.from(ga(this.model,t.model),ga(this.deployment,t.deployment))}};const q=e=>typeof e==`string`?e:e.id,Sm=e=>{if(P(!e.includes(`
35
- `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return O(t,1)?t:[``]}return[e.trim()]},Cm=e=>Sm(e).join(`/`),wm=e=>{let t=Sm(e);return O(t,2)?t.slice(0,-1).join(`/`):null},Tm=e=>e.includes(`/`)?Sm(e).pop()??e:e.trim();var Em=class{#e=new Map;#t=new Map;#n=new Dn.default(()=>new Set);#r=new Dn.default(()=>new Set);#i=new Set;#a=new Map;#o=new Dn.default(()=>new Set);#s=new Dn.default(()=>new Set);#c=new Dn.default(()=>new Set);#l=new Dn.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=cn(t.elements);for(let e of Zi(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of cn(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof _m||e instanceof vm)return e;let t=q(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=q(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(V.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return $i(this.#u,`${t}@${n}`,()=>new ym(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=q(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=q(e);return this.#t.get(t)||null}children(e){let t=q(e);return this.#n.get(t)}*siblings(e){let t=q(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=q(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=q(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=q(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=no(e)?new _m(this,Object.freeze(e)):new vm(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=Ri(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new bm(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...Ki(n)])this.#c.get(e).add(t);for(let e of Ki(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of Ki(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},Dm=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(V.flatten(t.source)),this.target=e.element(V.flatten(t.target));let n=Gi(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return Ot(this.$relationship.title)?null:this.$relationship.title}get technology(){return Ot(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Xt(this.$relationship.summary,this.$relationship.description)}get summary(){return Ao.memoize(this,`summary`,ja(this.$relationship))}get description(){return Ao.memoize(this,`description`,Ma(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!A(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},Om=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Ao.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?Za(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return Xa(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},km=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Ao.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return D(this.$node.modelRef)}hasDeployment(){return D(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return Wa(this.$node)}isTagged(e){return this.tags.includes(e)}},Am=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new Dn.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new km(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new Om(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?Tm(n.title):null,this.viewPath=n.title?Cm(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Ra]}get stage(){return this.#e[La]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Ao.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>ks(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Es(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=q(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(q(e))??null}findNodeWithElement(e){let t=q(e);return this.#i.has(t)?na(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=q(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(q(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(q(e))}includesDeployment(e){return this.#a.has(q(e))}includesRelation(e){return this.#o.has(q(e))}isComputed(){return this.#e[La]===`computed`}isLayouted(){return this.#e[La]===`layouted`}isDiagram(){return this.#e[La]===`layouted`}isElementView(){return this.#e[Ra]===`element`}isScopedElementView(){return this.#e[Ra]===`element`&&D(this.#e.viewOf)}isDeploymentView(){return this.#e[Ra]===`deployment`}isDynamicView(){return this.#e[Ra]===`dynamic`}},jm=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=gt(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),Ot(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof Am&&e.push(t);return e})}},Mm=class e{Aux;_elements=new Map;_parents=new Map;_children=new Dn.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new Dn.default(()=>new Set);_outgoing=new Dn.default(()=>new Set);_internal=new Dn.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new Dn.default(()=>new Set);_allTags=new Dn.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[La]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of Yt(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of Yt(e.imports??{}))for(let e of Zi(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of cn(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new Em(this),Ia(e,`computed`)||Ia(e,`layouted`)){let t=Mi(`/`),n=T(cn(e.views),C(e=>({view:e,path:Cm(e.title??e.id),folderPath:e.title&&wm(e.title)||``})),Ht((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=Zt(e,`/`);P(O(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new jm(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||Zt(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(A(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new Am(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new jm(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>No.from(this.$data.project.styles,this.$data.specification.customColors?{theme:{colors:this.$data.specification.customColors}}:void 0))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[La]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof hm)return e;let t=q(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(q(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=q(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(q(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=q(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=q(e);return this._parents.get(t)||null}children(e){let t=q(e);return this._children.get(t)}*siblings(e){let t=q(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=q(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=q(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=q(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>Ht([...this._allTags.keys()],ji))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>T([...this._allTags.entries()],C(([e,t])=>({tag:e,count:t.size,tagged:t})),Ht((e,t)=>ji(e.tag,t.tag)),pn([E(`count`),`desc`])))}findByTag(e,t){return ta(this._allTags.get(e),e=>t===`elements`?e instanceof hm:t===`views`?e instanceof Am:t===`relationships`?e instanceof Dm:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=uo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=uo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new hm(this,Object.freeze(e));this._elements.set(t.id,t);let n=Ri(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!qa(t.id),`Imported element already has global FQN`);let n=Ka(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new hm(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=Ri(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=Ri(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new Dm(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=Gi(n.id,r.id);if(i)for(let e of[i,...Ki(i)])this._internal.get(e).add(t);for(let e of Ki(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of Ki(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Mm.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Mm||={});let Nm;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(Nm||={});const Pm=Symbol.for(`nodejs.util.inspect.custom`);var Fm=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Sa(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[Pm](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
36
- `)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&va(this.relations.model,t.relations.model)&&va(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new xm(t.model??new Set,t.deployment??new Set):this.relations)}};function Im(e,t){if(!t){let t=e;return e=>Im(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function Lm(e,t){let n=t;for(let t of e)Im(t,n)&&(n=t);return n===t?null:n}function Rm(e){return e.boundary?.id?`.${e.boundary.id}`:``}function zm(e,t){if(!e||Fi(e)){let t=e??`asc`;return e=>Bm(e,t)}return Bm(e,t??`asc`)}function Bm(e,t){return T(e,C(e=>({id:Rm(e),conn:e})),Qi(t),C(e=>e.conn))}function Vm(e,t){return e.filter(e=>Im(t,e))}function Hm(e,t){return e.filter(Im(t))}function Um(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Wm(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function Gm(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Km(e,t){if(!t){let t=e;return e=>Km(e,t)}let n=e;return Hi(n.source,t)&&!Hi(n.target,t)}function qm(e,t){if(!t){let t=e;return e=>qm(e,t)}let n=e;return Hi(n.target,t)&&!Hi(n.source,t)}function Jm(e,t){if(!t){let t=e;return e=>Jm(e,t)}let n=e;return Hi(n.source,t)!==Hi(n.target,t)}var Ym=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Sa(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&ca(this.relations,_t(Gm(this)))}get directRelations(){return new Set(ta(this.relations,Gm(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,ga(this.relations,t.relations))}difference(t){return new e(this.source,this.target,z(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,_a(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&va(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[Pm](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
37
- `)}reversed(){return new e(this.target,this.source)}},Xm=e({findConnection:()=>Zm,findConnectionsBetween:()=>Qm,findConnectionsWithin:()=>$m});function Zm(e,t,n=`directed`){if(e===t||Vi(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new Fm(e,t,r)]:[];return n===`directed`?i:[...i,...Zm(t,e,`directed`)]}function Qm(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Zm(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function $m(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Qm(t,r.slice(n+1),`both`)),e),[])}var eh=e({findConnection:()=>th,findConnectionsBetween:()=>nh,findConnectionsWithin:()=>rh});function th(e,t,n=`directed`){if(e===t||Vi(e,t))return[];let r=_a(e.allOutgoing,t.allIncoming),i=r.size>0?new Ym(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=_a(e.allIncoming,t.allOutgoing),o=a.size>0?new Ym(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function nh(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of th(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function rh(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...nh(t,r.slice(n+1),`both`)),e),[])}function ih(e){return e instanceof _m}function ah(e){return e instanceof vm}function oh(e){return ih(e)||ah(e)}function sh(e){return e instanceof ym}function ch(e){return e instanceof hm}var lh=class extends He{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=te(e);let r=super.createDescription(e,t,n);return Ps(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.belongsTo(n),r.likec4ProjectId=n.likec4ProjectId),r}},uh=class extends Oe{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.belongsTo(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return Ue(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const dh=Symbol.for(`idattr`),fh={writeId(e,t){return e[dh]=t,e},readId(e){return e[dh]}},ph={writeId(e,t){return w(t)?e[dh]=void 0:e[dh]=t,e},readId(e){return e[dh]}};function mh(e){return e.textDocument.languageId===Hp.languageId}function hh(e){return mh(e)&&e.state==m.Validated&&!!e.c4Specification&&!!e.c4Elements&&!!e.c4ExtendElements&&!!e.c4ExtendDeployments&&!!e.c4ExtendRelations&&!!e.c4Relations&&!!e.c4Views&&!!e.c4Deployments&&!!e.c4DeploymentRelations&&!!e.c4Imports}function gh(e){return e?.markdown||e?.text}function _h(e){let t=parseFloat(e);return isNaN(t)?100:Ut(t,{min:0,max:100})}function vh({value:e}){return _h(e)}function yh({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:F(e)}}function bh({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function xh(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case cl(r):{let e=Sh(r);D(e)&&(n.color=e);break}case Cd(r):n.line=r.value;break;case il(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function Sh(e){return e?.themeColor??e?.customColor?.$refText}function Ch(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function wh(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function Th(e){return me(e,e=>cp(e)||Nl(e)||ql(e))}const Eh=e=>Fd(e)||eu(e)||Du(e)||gu(e)||Vl(e)||ou(e),Dh=e=>Ld(e)||jl(e)||xl(e)||Cu(e)||_l(e);function Oh(e){for(;;){if(Dh(e)||Eh(e))return!1;if(Ku(e)||zd(e))return!0;if(e.$container)e=e.$container;else return!1}}function kh(e){for(;;){if(Dh(e))return!1;if(Eh(e))return!0;if(e.$container)e=e.$container;else return!1}}function Ah(e){for(;;){if(Eh(e))return!1;if(Dh(e))return!0;if(e.$container)e=e.$container;else return!1}}const jh=Mi(`/`,!0),Mh=(e,t)=>jh(e.uri.path,t.uri.path),Nh=e=>e.textDocument.languageId!==Hp.languageId||Ps(e.uri);var Ph=class extends h{constructor(e){super(e),this.services=e}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(Mh);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e)}getDocument(e){let t=super.getDocument(e);if(t&&!mh(t))throw Error(`Document ${t.uri.path} is not a LikeC4 document`);return t&&!Nh(t)&&(t.likec4ProjectId=this.services.workspace.ProjectsManager.belongsTo(t)),t}get allKnownDocuments(){return Ue(this.documentMap.values())}get all(){return this.allKnownDocuments.filter(e=>e.textDocument.languageId===Hp.languageId?(Ps(e.uri)||(e.likec4ProjectId=this.services.workspace.ProjectsManager.belongsTo(e)),!0):!1)}get allExcludingBuiltin(){let e=this.services.workspace.ProjectsManager;return this.all.filter(t=>!(Ps(t.uri)||e.isExcluded(t)))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return this.allKnownDocuments.filter(n=>Ps(n.uri)||n.textDocument.languageId!==Hp.languageId||!t.isIncluded(e,n.uri)?!1:(n.likec4ProjectId=e,!0))}groupedByProject(){return this.services.workspace.ProjectsManager.all.reduce((e,t)=>{let n=this.projectDocuments(t).toArray();return O(n,1)&&(e[t]=n),e},{})}resetProjectIds(){this.allKnownDocuments.forEach(e=>{Nh(e)||delete e.likec4ProjectId})}},Fh=t(Gn(),1);const J=W.getChild(`ProjectsManager`);function Ih(e){return _.isUri(e)?e.toString():typeof e==`string`?e.startsWith(`file://`)?e:_.file(e).toString():e.uri.toString()}const Lh=Mi(`/`,!0),Rh=(e,t)=>Lh($n(e.path),$n(t.path));function zh(e){let t=Ih(e);return e=>t.startsWith(e.folder)}function Bh(e){return e=Ih(e),Zn(e)}const Vh={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,Fh.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};var Hh=class e{static DefaultProjectId=Vh.id;#e=[];#t=void 0;#n=void 0;#r=new jn.default;#i=[];#a=new Dn.default(t=>{if(t===e.DefaultProjectId){let e=Bh(this.getWorkspaceFolder());return{id:t,config:Vh.config,folder:e,folderUri:_.parse(e),exclude:Vh.exclude,includeConfig:Vh.includeConfig}}return N(this.#i.find(e=>e.id===t),`Project ${t} not found`)});#o=new WeakMap;constructor(e){this.services=e,J.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#i.length>1))return this.#i[0]?.id??e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#n=void 0,!t||t===e.DefaultProjectId){J.debug`reset default project ID`,this.#t=void 0;return}P(this.#i.find(e=>e.id===t),`Project "${t}" not found`),J.debug`set default project ID to ${t}`,this.#t=t}}get default(){if(!this.#n){let t=this.defaultProjectId??e.DefaultProjectId;this.#n=this.#a.get(t)}return this.#n}get all(){if(O(this.#i,1)){let e=[...C(this.#i,E(`id`)),Vh.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);if(t>0){let[n]=e.splice(t,1);return[n,...e]}}return e}return[Vh.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId||this.belongsTo(e),n=this.#a.get(t);return{id:t,folderUri:n.folderUri,config:n.config,...n.includePaths&&{includePaths:C(n.includePaths,E(`uri`))}}}findAllProjectsByFolder(e){let t=Bh(e);return this.#i.filter(e=>e.folder.startsWith(t)||t.startsWith(e.folder))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#r.has(t),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${[...this.#r.keys()].join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#i.length>1}isExcluded(e){if(typeof e==`string`||_.isUri(e)){let t=Ih(e),n=this.findProjectForDocument(t);if(!n.exclude)return!1;let r=Qn(t);return n.exclude(r)}let t=this.#o.get(e);return t===void 0&&(t=this.isExcluded(e.uri),this.#o.set(e,t)),t}isIncluded(e,t){if(typeof t!=`string`&&!_.isUri(t))return this.isIncluded(e,t.uri);if(this.belongsTo(t)===e)return!this.isExcluded(t);let n=this.#a.get(e)?.includePaths;return n?n.some(zh(t)):!1}isConfigFile(e){let t=ar(e.toString(),{strict:!1})?.toLowerCase(),n=!!t&&gs(t);return n&&Vh.exclude(e.path)?(J.debug`exclude config file ${e.path}`,!1):n}async registerConfigFile(e,t){if(Vh.exclude(e.path))throw Error(`Path to ${e.fsPath} is excluded by: ${Vh.config.exclude.join(`, `)}`);if(!this.isConfigFile(e))throw Error(`${e.fsPath} is not a valid LikeC4 config filename.`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e),r=Xn(e.path,`..`),i=e.with({path:r});return await this.registerProject({config:n,folderUri:i},t)}catch(t){if(!d(t))throw this.services.lsp.Connection?.window.showErrorMessage(`LikeC4: Failed to register project at ${e.fsPath}`),Ur(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=ds(e.config),r=Bh(e.folderUri),i=this.#i.find(e=>e.folder===r);if(i&&Yn(i.config,n))return i;let a=!1,o;if(i){a=!0,i.config.name===n.name?(o=i.id,J.info`update project ${i.id} on config change`):(this.#r.delete(i.id),J.info`unregister project ${i.id} folder: ${r}`,o=this.uniqueProjectId(n.name),i.id=o,J.info`re-register project ${i.id} folder: ${r}`),i.config=n;let e=di(n.include);i.includeConfig=e}else{this.#r.has(n.name)&&J.warn`Project "${n.name}" already exists, generating unique ID`,o=this.uniqueProjectId(n.name);let e=di(n.include);i={id:o,config:n,folder:r,folderUri:_.parse(r),includeConfig:e},a=this.#i.some(e=>e.folder.startsWith(r)||r.startsWith(e.folder)),this.#i=T([...this.#i,i],Ht((e,t)=>Rh(e.folderUri,t.folderUri))),J.info`register project ${i.id} folder: ${r}`}if(w(n.exclude))i.exclude=Vh.exclude;else if(O(n.exclude,1)){let e=C(n.exclude,e=>(!er(e)&&!e.startsWith(`**`)&&(e=rr(`**`,e)),or(Xn(i.folderUri.path,e))));i.exclude=(0,Fh.default)(e,{contains:!0,dot:!0})}if(i.includeConfig.paths&&O(i.includeConfig.paths,1)){i.includePaths=C(i.includeConfig.paths,e=>{let t=Xn(i.folderUri.path,e),n=i.folderUri.with({path:t});return{uri:n,folder:Bh(n)}}),J.debug`project ${i.id} include paths: ${i.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let e of i.includePaths)for(let t of this.#i)if(t.id!==i.id&&((e.folder.startsWith(t.folder)||t.folder.startsWith(e.folder))&&(a=!0,J.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:i.id,includePath:e.folder,otherProjectId:t.id})),t.includePaths))for(let n of t.includePaths)(e.folder.startsWith(n.folder)||n.folder.startsWith(e.folder))&&(a=!0,J.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:i.id,includePath:e.folder,otherProjectId:t.id,otherIncludePath:n.folder}))}else delete i.includePaths;return this.#n=void 0,this.#r.set(i.id,r),this.#a.clear(),this.#s?i:(a&&await this.rebuidProject(i.id,t).catch(e=>d(e)?Promise.reject(e):(J.warn(`Failed to rebuild project {projectId} after config change`,{projectId:i.id,error:e}),Promise.resolve())),this.notifyListeners(),i)}belongsTo(e){if(_.isUri(e)||typeof e==`string`){let t=Ih(e);return this.findProjectForDocument(t).id}return this.documentBelongsTo.get(e,()=>this.findProjectForDocument(Ih(e.uri))).id}#s=null;async reloadProjects(e){return this.#s?(J.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(J.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(d(e)||J.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t){J.warn(`No workspace folders found`);return}J.debug`start reload projects`;let n=[];for(let e of t)try{J.debug`scan projects in folder ${e.uri}`;let t=await this.services.workspace.FileSystemProvider.scanProjectFiles(_.parse(e.uri));for(let e of t)e.isFile&&this.isConfigFile(e.uri)&&(J.debug`found config ${e.uri.fsPath}`,n.push(e.uri))}catch(t){J.error(`Failed to scanProjectFiles, {folder}`,{folder:e.uri,error:t})}n.length===0&&this.#i.length!==0&&J.warning(`No config files found, but some projects were registered before`),n.sort(Rh),this.#i=[],this.#r.clear(),this.#a.clear();for(let t of n){if(e?.isCancellationRequested)break;await this.registerConfigFile(t,e).catch(e=>{d(e)||J.warn(M(e))})}if(this.reset(),e?.isCancellationRequested)throw ce;await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=e,n=1;for(;this.#r.has(t);)t=`${e}-${n++}`;return t}reset(){J.debug(`reset`),this.#n=void 0,this.#t&&!this.#r.has(this.#t)&&(this.#t=void 0),this.services.workspace.LangiumDocuments.resetProjectIds(),this.documentBelongsTo.clear(),this.mappingsToProject.clear(),this.#a.clear(),this.#o=new WeakMap}async rebuidProject(e,t){this.#n=void 0;let n=this.#i.find(t=>t.id===e)??this.default;n.id!==e&&J.warn`Project ${e} not found, rebuilding default project ${n.id}`;let r=J.getChild(n.id),i=n.folder,a=n.includePaths,o=this.services.workspace.LangiumDocuments.allKnownDocuments.filter(e=>!Ps(e.uri)).toArray();if(o.length===0)return;let s=T(o,k(e=>{if(n.exclude?.(e.uri.path))return!1;let t=Ih(e.uri);if(t.startsWith(i)||a&&a.some(zh(t)))return!0;let r=Zn(Xn(t,`..`));return r.startsWith(i)||i.startsWith(r)}),C(e=>e.uri));if(s.length===0){r.debug(`no documents in project, skipping rebuild`);return}r.info(`rebuild project documents: {docs}`,{docs:s.length}),this.reset(),await this.services.workspace.DocumentBuilder.update(s,[],t).catch(e=>{r.warn(`Failed to rebuild project`,{error:e})})}findProjectForDocument(e){return this.mappingsToProject.get(e,()=>{let t=zh(e);return this.#i.find(t)||(this.#i.find(({includePaths:e})=>!!e&&e.some(t))??this.default)})}get mappingsToProject(){return R(this,`_mappingsToProject`,()=>new Ze(this.services))}get documentBelongsTo(){return R(this,`_documentBelongsTo`,()=>new Ze(this.services))}getAllIncludePaths(){let e=[];for(let t of this.#i)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Ae.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return J.warn(`Failed to get workspace URI, using default folder`,{error:e}),_.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){J.warn(M(e))}}},Uh=u(),Wh=class extends Te{documentFactory;fileSystemProvider;initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=_.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){G(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri,Uh.CancellationToken.None)}catch(e){G(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(js,_.parse(Ns)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{W.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),W.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){W.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Jt(i,e=>e.uri.path))if(!this.services.workspace.ProjectsManager.isExcluded(e.uri))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){W.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?W.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):W.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){if(this.services.workspace.ProjectsManager.isConfigFile(t.uri))return!1;let r=super.includeEntry(e,t,n);return r&&t.isFile?!this.services.workspace.ProjectsManager.isExcluded(t.uri):r}workspace(){return this.folders&&O(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.all.map(e=>e.uri).toArray();W.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.services.workspace.Cache.clear(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),_.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}};const Gh=x({path:y().describe(`Path to the file`),range:x({start:x({line:it(),character:it()}),end:x({line:it(),character:it()})}).describe(`Range in the file`)}).nullable(),Kh=y().refine(e=>!0).optional().default(Hh.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),qh=b(x({id:y().describe(`View id`),title:y().describe(`View title`),type:st([`element`,`deployment`,`dynamic`]).describe(`View type`)})),Jh=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),Yh=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:_.parse(r.uri).fsPath,range:r.range}:null}catch(e){return dm.debug(`Failed to locate {params}`,{error:e,params:n}),null}},Xh=x({id:y(),title:y(),kind:y()}),Zh=x({type:st([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:Xh,target:Xh,kind:y().nullable().describe(`Relationship kind`),title:y().nullable().describe(`Relationship title`),description:y().nullable().describe(`Relationship description`),technology:y().nullable().describe(`Relationship technology`),tags:b(y()).describe(`Relationship tags`),includedInViews:qh.describe(`Views that include this relationship`),sourceLocation:Gh}),Qh=fm({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
36
+ `)}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return this.cache.delete(e.id),o}async remove(e,t){let n=uc.getChild(e.id),r=pc(e),i=le.joinPath(r,fc(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:Ve.create(0,0,0,0)};this.cache.delete(e.id);try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){uc.trace`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=g.parse(e.icon),r=le.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${hc}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(hc)){let n=e.icon.substring(9),r=le.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const _c=`AnyProperty`;function vc(e){return K.isInstance(e,_c)}const yc=`ColorLiteral`;function bc(e){return K.isInstance(e,yc)}const xc=`DeploymentElement`;function Sc(e){return K.isInstance(e,xc)}const Cc=`DeploymentNodeOrElementKind`,wc=`DeploymentViewRule`;function Tc(e){return K.isInstance(e,wc)}const Ec=`DynamicViewProperty`,Dc=`DynamicViewRule`;function Oc(e){return K.isInstance(e,Dc)}const kc=`DynamicViewStep`;function Ac(e){return K.isInstance(e,kc)}const jc=`ElementProperty`;function Mc(e){return K.isInstance(e,jc)}const Nc=`ExpressionV2`;function Pc(e){return K.isInstance(e,Nc)}const Fc=`ExtendElementProperty`,Ic=`ExtendRelationProperty`,Lc=`FqnExpr`;function Rc(e){return K.isInstance(e,Lc)}const zc=`FqnExprOrWhere`;function Bc(e){return K.isInstance(e,zc)}const Vc=`FqnExprOrWith`;function Hc(e){return K.isInstance(e,Vc)}const Uc=`FqnReferenceable`,Wc=`LikeC4View`;function Gc(e){return K.isInstance(e,Wc)}const Kc=`MetadataProperty`;function qc(e){return K.isInstance(e,Kc)}const Jc=`MetadataValue`,Yc=`ModelReferenceable`,Xc=`Referenceable`,Zc=`RelationExpr`;function Qc(e){return K.isInstance(e,Zc)}const $c=`RelationExprOrWhere`;function el(e){return K.isInstance(e,$c)}const tl=`RelationExprOrWith`;function nl(e){return K.isInstance(e,tl)}const rl=`RelationProperty`,il=`RelationshipStyleProperty`;function al(e){return K.isInstance(e,il)}const ol=`SizeProperty`;function sl(e){return K.isInstance(e,ol)}const cl=`StringProperty`;function ll(e){return K.isInstance(e,cl)}const ul=`StyleProperty`;function dl(e){return K.isInstance(e,ul)}const fl=`ViewProperty`;function pl(e){return K.isInstance(e,fl)}const ml=`ViewRule`;function hl(e){return K.isInstance(e,ml)}const gl=`ViewRuleStyleOrGlobalRef`;function _l(e){return K.isInstance(e,gl)}const vl=`WhereElement`;function yl(e){return K.isInstance(e,vl)}const bl=`WhereElementExpression`;function xl(e){return K.isInstance(e,bl)}const Sl=`WhereExpression`,Cl=`WhereKindEqual`;function wl(e){return K.isInstance(e,Cl)}const Tl=`WhereRelation`;function El(e){return K.isInstance(e,Tl)}const Dl=`WhereRelationExpression`;function Ol(e){return K.isInstance(e,Dl)}const kl=`WhereTagEqual`;function Al(e){return K.isInstance(e,kl)}const jl=`AbstractDynamicStep`,Ml=`ArrowProperty`;function Nl(e){return K.isInstance(e,Ml)}const Pl=`BorderProperty`;function Fl(e){return K.isInstance(e,Pl)}const Il=`ColorProperty`;function Ll(e){return K.isInstance(e,Il)}const Rl=`CustomColor`,zl=`CustomElementProperties`;function Bl(e){return K.isInstance(e,zl)}const Vl=`CustomRelationProperties`;function Hl(e){return K.isInstance(e,Vl)}const Ul=`DeployedInstance`;function Wl(e){return K.isInstance(e,Ul)}const Gl=`DeployedInstanceBody`;function Kl(e){return K.isInstance(e,Gl)}const ql=`DeploymentNode`;function Jl(e){return K.isInstance(e,ql)}const Yl=`DeploymentNodeBody`;function Xl(e){return K.isInstance(e,Yl)}const Zl=`DeploymentNodeKind`;function Ql(e){return K.isInstance(e,Zl)}const $l=`DeploymentRelation`;function eu(e){return K.isInstance(e,$l)}const tu=`DeploymentRelationBody`;function nu(e){return K.isInstance(e,tu)}const ru=`DeploymentView`;function iu(e){return K.isInstance(e,ru)}const au=`DeploymentViewBody`;function ou(e){return K.isInstance(e,au)}const su=`DeploymentViewRulePredicate`;function cu(e){return K.isInstance(e,su)}const lu=`DeploymentViewRuleStyle`;function uu(e){return K.isInstance(e,lu)}const du=`DirectedRelationExpr`;function fu(e){return K.isInstance(e,du)}const pu=`DynamicView`;function mu(e){return K.isInstance(e,pu)}const hu=`DynamicViewBody`;function gu(e){return K.isInstance(e,hu)}const _u=`DynamicViewDisplayVariantProperty`;function vu(e){return K.isInstance(e,_u)}const yu=`DynamicViewGlobalPredicateRef`;function bu(e){return K.isInstance(e,yu)}const xu=`DynamicViewIncludePredicate`;function Su(e){return K.isInstance(e,xu)}const Cu=`DynamicViewParallelSteps`;function wu(e){return K.isInstance(e,Cu)}const Tu=`DynamicViewRef`,Eu=`Element`;function Du(e){return K.isInstance(e,Eu)}const Ou=`ElementBody`;function ku(e){return K.isInstance(e,Ou)}const Au=`ElementKind`;function ju(e){return K.isInstance(e,Au)}const Mu=`ElementKindExpression`;function Nu(e){return K.isInstance(e,Mu)}const Pu=`ElementRef`;function Fu(e){return K.isInstance(e,Pu)}const Iu=`ElementStringProperty`;function Lu(e){return K.isInstance(e,Iu)}const Ru=`ElementStyleProperty`;function zu(e){return K.isInstance(e,Ru)}const Bu=`ElementTagExpression`;function Vu(e){return K.isInstance(e,Bu)}const Hu=`ElementView`;function Uu(e){return K.isInstance(e,Hu)}const Wu=`ElementViewBody`;function Gu(e){return K.isInstance(e,Wu)}const Ku=`ElementViewRef`,qu=`Expressions`;function Ju(e){return K.isInstance(e,qu)}const Yu=`ExtendDeployment`;function Xu(e){return K.isInstance(e,Yu)}const Zu=`ExtendDeploymentBody`;function Qu(e){return K.isInstance(e,Zu)}const $u=`ExtendElement`;function ed(e){return K.isInstance(e,$u)}const td=`ExtendElementBody`;function nd(e){return K.isInstance(e,td)}const rd=`ExtendRelation`;function id(e){return K.isInstance(e,rd)}const ad=`ExtendRelationBody`;function od(e){return K.isInstance(e,ad)}const sd=`FqnExpressions`;function cd(e){return K.isInstance(e,sd)}const ld=`FqnExprWhere`;function ud(e){return K.isInstance(e,ld)}const dd=`FqnExprWith`;function fd(e){return K.isInstance(e,dd)}const pd=`FqnRef`;function md(e){return K.isInstance(e,pd)}const hd=`FqnRefExpr`;function gd(e){return K.isInstance(e,hd)}const _d=`GlobalDynamicPredicateGroup`;function vd(e){return K.isInstance(e,_d)}const yd=`GlobalPredicateGroup`;function bd(e){return K.isInstance(e,yd)}const xd=`Globals`;function Sd(e){return K.isInstance(e,xd)}const Cd=`GlobalStyle`;function wd(e){return K.isInstance(e,Cd)}const Td=`GlobalStyleGroup`;function Ed(e){return K.isInstance(e,Td)}const Dd=`GlobalStyleId`,Od=`HexColor`;function kd(e){return K.isInstance(e,Od)}const Ad=`IconColorProperty`;function jd(e){return K.isInstance(e,Ad)}const Md=`IconPositionProperty`;function Nd(e){return K.isInstance(e,Md)}const Pd=`IconProperty`;function Fd(e){return K.isInstance(e,Pd)}const Id=`IconSizeProperty`;function Ld(e){return K.isInstance(e,Id)}const Rd=`Imported`;function zd(e){return K.isInstance(e,Rd)}const Bd=`ImportsFromPoject`;function Vd(e){return K.isInstance(e,Bd)}const Hd=`IncomingRelationExpr`;function Ud(e){return K.isInstance(e,Hd)}const Wd=`InOutRelationExpr`;function Gd(e){return K.isInstance(e,Wd)}const Kd=`LibIcon`;function qd(e){return K.isInstance(e,Kd)}const Jd=`LikeC4Grammar`;function Yd(e){return K.isInstance(e,Jd)}const Xd=`LikeC4Lib`;function Zd(e){return K.isInstance(e,Xd)}const Qd=`LineProperty`;function $d(e){return K.isInstance(e,Qd)}const ef=`LinkProperty`;function tf(e){return K.isInstance(e,ef)}const nf=`MarkdownOrString`;function rf(e){return K.isInstance(e,nf)}const af=`MetadataArray`;function of(e){return K.isInstance(e,af)}const sf=`MetadataAttribute`;function cf(e){return K.isInstance(e,sf)}const lf=`MetadataBody`;function uf(e){return K.isInstance(e,lf)}const df=`Model`;function ff(e){return K.isInstance(e,df)}const pf=`ModelDeployments`;function mf(e){return K.isInstance(e,pf)}const hf=`ModelViews`;function gf(e){return K.isInstance(e,hf)}const _f=`MultipleProperty`;function vf(e){return K.isInstance(e,_f)}const yf=`NavigateToProperty`;function bf(e){return K.isInstance(e,yf)}const xf=`NotationProperty`;function Sf(e){return K.isInstance(e,xf)}const Cf=`NotesProperty`;function wf(e){return K.isInstance(e,Cf)}const Tf=`OpacityProperty`;function Ef(e){return K.isInstance(e,Tf)}const Df=`OutgoingRelationExpr`;function Of(e){return K.isInstance(e,Df)}const kf=`PaddingSizeProperty`;function Af(e){return K.isInstance(e,kf)}const jf=`Relation`;function Mf(e){return K.isInstance(e,jf)}const Nf=`RelationBody`;function Pf(e){return K.isInstance(e,Nf)}const Ff=`RelationExprWhere`;function If(e){return K.isInstance(e,Ff)}const Lf=`RelationExprWith`;function Rf(e){return K.isInstance(e,Lf)}const zf=`RelationKindDotRef`;function Bf(e){return K.isInstance(e,zf)}const Vf=`RelationNavigateToProperty`;function Hf(e){return K.isInstance(e,Vf)}const Uf=`RelationshipKind`;function Wf(e){return K.isInstance(e,Uf)}const Gf=`RelationStringProperty`;function Kf(e){return K.isInstance(e,Gf)}const qf=`RelationStyleProperty`;function Jf(e){return K.isInstance(e,qf)}const Yf=`RGBAColor`;function Xf(e){return K.isInstance(e,Yf)}const Zf=`ShapeProperty`;function Qf(e){return K.isInstance(e,Zf)}const $f=`ShapeSizeProperty`;function ep(e){return K.isInstance(e,$f)}const tp=`SpecificationColor`;function np(e){return K.isInstance(e,tp)}const rp=`SpecificationDeploymentNodeKind`;function ip(e){return K.isInstance(e,rp)}const ap=`SpecificationElementKind`;function op(e){return K.isInstance(e,ap)}const sp=`SpecificationElementStringProperty`;function cp(e){return K.isInstance(e,sp)}const lp=`SpecificationRelationshipKind`;function up(e){return K.isInstance(e,lp)}const dp=`SpecificationRelationshipStringProperty`;function fp(e){return K.isInstance(e,dp)}const pp=`SpecificationRule`;function mp(e){return K.isInstance(e,pp)}const hp=`SpecificationTag`;function gp(e){return K.isInstance(e,hp)}const _p=`StrictFqnElementRef`;function vp(e){return K.isInstance(e,_p)}const yp=`StrictFqnRef`;function bp(e){return K.isInstance(e,yp)}function xp(e){return K.isInstance(e,`Tag`)}const Sp=`TagRef`;function Cp(e){return K.isInstance(e,Sp)}const wp=`Tags`;function Tp(e){return K.isInstance(e,wp)}const Ep=`TextSizeProperty`;function Dp(e){return K.isInstance(e,Ep)}const Op=`ViewRef`,kp=`ViewRuleAutoLayout`;function Ap(e){return K.isInstance(e,kp)}const jp=`ViewRuleGlobalPredicateRef`;function Mp(e){return K.isInstance(e,jp)}const Np=`ViewRuleGlobalStyle`;function Pp(e){return K.isInstance(e,Np)}const Fp=`ViewRuleGroup`;function Ip(e){return K.isInstance(e,Fp)}const Lp=`ViewRulePredicate`;function Rp(e){return K.isInstance(e,Lp)}const zp=`ViewRuleRank`;function Bp(e){return K.isInstance(e,zp)}const Vp=`ViewRuleStyle`;function Hp(e){return K.isInstance(e,Vp)}const Up=`ViewStringProperty`;function Wp(e){return K.isInstance(e,Up)}const Gp=`WhereBinaryExpression`;function Kp(e){return K.isInstance(e,Gp)}const qp=`WhereElementKind`;function Jp(e){return K.isInstance(e,qp)}const Yp=`WhereElementNegation`;function Xp(e){return K.isInstance(e,Yp)}const Zp=`WhereElementTag`;function Qp(e){return K.isInstance(e,Zp)}const $p=`WhereRelationKind`;function em(e){return K.isInstance(e,$p)}const tm=`WhereRelationNegation`;function nm(e){return K.isInstance(e,tm)}const rm=`WhereRelationParticipantKind`;function im(e){return K.isInstance(e,rm)}const am=`WhereRelationParticipantTag`;function om(e){return K.isInstance(e,am)}const sm=`WhereRelationTag`;function cm(e){return K.isInstance(e,sm)}const lm=`WildcardExpression`;function um(e){return K.isInstance(e,lm)}const dm=`DynamicStepChain`;function fm(e){return K.isInstance(e,dm)}const pm=`DynamicStepSingle`;function mm(e){return K.isInstance(e,pm)}var hm=class extends ue{getAllTypes(){return[jl,_c,Ml,Pl,yc,Il,Rl,zl,Vl,Ul,Gl,xc,ql,Yl,Zl,Cc,$l,tu,ru,au,wc,su,lu,du,dm,pm,pu,hu,_u,yu,xu,Cu,Ec,Tu,Dc,kc,Eu,Ou,Au,Mu,jc,Pu,Iu,Ru,Bu,Hu,Wu,Ku,Nc,qu,Yu,Zu,$u,td,Fc,rd,ad,Ic,Lc,zc,Vc,ld,dd,sd,pd,hd,Uc,_d,yd,Cd,Td,Dd,xd,Od,Ad,Md,Pd,Id,Rd,Bd,Wd,Hd,Kd,Jd,Xd,Wc,Qd,ef,nf,af,sf,lf,Kc,Jc,df,pf,Yc,hf,_f,yf,xf,Cf,Tf,Df,kf,Yf,Xc,jf,Nf,Zc,$c,tl,Ff,Lf,zf,Vf,rl,Gf,qf,Uf,il,Zf,$f,ol,tp,rp,ap,sp,lp,dp,pp,hp,_p,yp,cl,ul,`Tag`,Sp,wp,Ep,fl,Op,ml,kp,jp,Np,Fp,Lp,zp,Vp,gl,Up,Gp,vl,bl,qp,Yp,Zp,Sl,Cl,Tl,Dl,$p,tm,rm,am,sm,kl,lm]}computeIsSubtype(e,t){switch(e){case Ml:case Qd:return this.isSubtype(il,t);case Pl:case Ad:case Md:case _f:case Tf:case Zf:return this.isSubtype(ul,t);case Il:return this.isSubtype(il,t)||this.isSubtype(ul,t);case Ul:case ql:return this.isSubtype(xc,t)||this.isSubtype(Xc,t);case Zl:case Au:return this.isSubtype(Cc,t);case ru:case pu:case Hu:return this.isSubtype(Wc,t);case su:case lu:return this.isSubtype(wc,t);case du:case Hd:case Wd:case Df:return this.isSubtype(Zc,t);case dm:case pm:return this.isSubtype(jl,t)||this.isSubtype(kc,t);case _u:return this.isSubtype(Ec,t);case yu:case xu:return this.isSubtype(Dc,t);case Ec:case jc:case rl:case cl:return this.isSubtype(_c,t);case Eu:return this.isSubtype(Uc,t)||this.isSubtype(Yc,t)||this.isSubtype(Xc,t);case Mu:case Bu:case hd:case lm:return this.isSubtype(Lc,t);case Iu:return this.isSubtype(jc,t)||this.isSubtype(cl,t);case Ru:return this.isSubtype(jc,t);case Yu:case $u:case Xc:return this.isSubtype(Uc,t);case Lc:case ld:return this.isSubtype(zc,t);case zc:case dd:return this.isSubtype(Vc,t);case Vc:case tl:return this.isSubtype(Nc,t);case Od:case Yf:return this.isSubtype(yc,t);case Pd:return this.isSubtype(jc,t)||this.isSubtype(ul,t);case Id:case kf:case $f:case Ep:return this.isSubtype(ol,t)||this.isSubtype(ul,t);case Rd:return this.isSubtype(Yc,t)||this.isSubtype(Xc,t);case ef:return this.isSubtype(jc,t)||this.isSubtype(Fc,t)||this.isSubtype(Ic,t)||this.isSubtype(rl,t)||this.isSubtype(fl,t);case nf:case af:return this.isSubtype(Jc,t);case sf:case xf:case Cf:case sp:case dp:return this.isSubtype(cl,t);case lf:return this.isSubtype(Kc,t);case Kc:return this.isSubtype(jc,t)||this.isSubtype(Fc,t)||this.isSubtype(Ic,t)||this.isSubtype(rl,t);case Zc:case Ff:return this.isSubtype($c,t);case $c:case Lf:return this.isSubtype(tl,t);case Vf:case qf:return this.isSubtype(rl,t);case Gf:return this.isSubtype(rl,t)||this.isSubtype(cl,t);case fl:return this.isSubtype(_c,t)||this.isSubtype(Ec,t);case kp:return this.isSubtype(wc,t)||this.isSubtype(Dc,t)||this.isSubtype(ml,t);case jp:case Fp:case Lp:case zp:return this.isSubtype(ml,t);case Np:case Vp:return this.isSubtype(gl,t);case gl:return this.isSubtype(Dc,t)||this.isSubtype(ml,t);case Up:return this.isSubtype(cl,t)||this.isSubtype(fl,t);case Gp:return this.isSubtype(bl,t)||this.isSubtype(Dl,t);case vl:case Yp:return this.isSubtype(bl,t);case bl:case Dl:return this.isSubtype(Sl,t);case qp:return this.isSubtype(vl,t)||this.isSubtype(Cl,t);case Zp:return this.isSubtype(vl,t)||this.isSubtype(kl,t);case Tl:case tm:return this.isSubtype(Dl,t);case $p:case rm:return this.isSubtype(Cl,t)||this.isSubtype(Tl,t);case am:case sm:return this.isSubtype(Tl,t)||this.isSubtype(kl,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return Uf;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Rl;case`DeploymentNode:kind`:return Zl;case`DynamicViewGlobalPredicateRef:predicate`:return _d;case`DynamicViewRef:view`:return pu;case`Element:kind`:case`ElementKindExpression:kind`:return Au;case`ElementViewRef:view`:return Hu;case`FqnRef:value`:case`StrictFqnRef:value`:return Xc;case`IconProperty:libicon`:return Kd;case`Imported:imported`:case`StrictFqnElementRef:el`:return Eu;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Wc;case`ViewRuleGlobalPredicateRef:predicate`:return yd;case`ViewRuleGlobalStyle:style`:return Dd;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Cc;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case jl:return{name:jl,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Ml:return{name:Ml,properties:[{name:`key`},{name:`value`}]};case Pl:return{name:Pl,properties:[{name:`key`},{name:`value`}]};case Il:return{name:Il,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Rl:return{name:Rl,properties:[{name:`name`}]};case zl:return{name:zl,properties:[{name:`props`,defaultValue:[]}]};case Vl:return{name:Vl,properties:[{name:`props`,defaultValue:[]}]};case Ul:return{name:Ul,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Gl:return{name:Gl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ql:return{name:ql,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Yl:return{name:Yl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Zl:return{name:Zl,properties:[{name:`name`}]};case $l:return{name:$l,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case tu:return{name:tu,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ru:return{name:ru,properties:[{name:`body`},{name:`name`}]};case au:return{name:au,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case su:return{name:su,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case lu:return{name:lu,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case du:return{name:du,properties:[{name:`source`},{name:`target`}]};case pu:return{name:pu,properties:[{name:`body`},{name:`name`}]};case hu:return{name:hu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`key`},{name:`value`}]};case yu:return{name:yu,properties:[{name:`predicate`}]};case xu:return{name:xu,properties:[{name:`exprs`}]};case Cu:return{name:Cu,properties:[{name:`steps`,defaultValue:[]}]};case Tu:return{name:Tu,properties:[{name:`view`}]};case Eu:return{name:Eu,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Ou:return{name:Ou,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Au:return{name:Au,properties:[{name:`name`}]};case Mu:return{name:Mu,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Pu:return{name:Pu,properties:[{name:`modelElement`}]};case Iu:return{name:Iu,properties:[{name:`key`},{name:`value`}]};case Ru:return{name:Ru,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Bu:return{name:Bu,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Hu:return{name:Hu,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Wu:return{name:Wu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Ku:return{name:Ku,properties:[{name:`view`}]};case qu:return{name:qu,properties:[{name:`prev`},{name:`value`}]};case Yu:return{name:Yu,properties:[{name:`body`},{name:`deploymentNode`}]};case Zu:return{name:Zu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case $u:return{name:$u,properties:[{name:`body`},{name:`element`}]};case td:return{name:td,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case rd:return{name:rd,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case ad:return{name:ad,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case sd:return{name:sd,properties:[{name:`prev`},{name:`value`}]};case ld:return{name:ld,properties:[{name:`subject`},{name:`where`}]};case dd:return{name:dd,properties:[{name:`custom`},{name:`subject`}]};case pd:return{name:pd,properties:[{name:`parent`},{name:`value`}]};case hd:return{name:hd,properties:[{name:`ref`},{name:`selector`}]};case _d:return{name:_d,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case yd:return{name:yd,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case xd:return{name:xd,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Cd:return{name:Cd,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Td:return{name:Td,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Dd:return{name:Dd,properties:[{name:`name`}]};case Od:return{name:Od,properties:[{name:`hex`}]};case Ad:return{name:Ad,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Md:return{name:Md,properties:[{name:`key`},{name:`value`}]};case Pd:return{name:Pd,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Id:return{name:Id,properties:[{name:`key`},{name:`value`}]};case Rd:return{name:Rd,properties:[{name:`imported`},{name:`prev`}]};case Bd:return{name:Bd,properties:[{name:`imports`},{name:`project`}]};case Hd:return{name:Hd,properties:[{name:`to`}]};case Wd:return{name:Wd,properties:[{name:`inout`}]};case Kd:return{name:Kd,properties:[{name:`name`}]};case Jd:return{name:Jd,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Xd:return{name:Xd,properties:[{name:`icons`,defaultValue:[]}]};case Qd:return{name:Qd,properties:[{name:`key`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`key`},{name:`title`},{name:`value`}]};case nf:return{name:nf,properties:[{name:`markdown`},{name:`text`}]};case af:return{name:af,properties:[{name:`values`,defaultValue:[]}]};case sf:return{name:sf,properties:[{name:`key`},{name:`value`}]};case lf:return{name:lf,properties:[{name:`props`,defaultValue:[]}]};case df:return{name:df,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case pf:return{name:pf,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case hf:return{name:hf,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case _f:return{name:_f,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case yf:return{name:yf,properties:[{name:`key`},{name:`value`}]};case xf:return{name:xf,properties:[{name:`key`},{name:`value`}]};case Cf:return{name:Cf,properties:[{name:`key`},{name:`value`}]};case Tf:return{name:Tf,properties:[{name:`key`},{name:`value`}]};case Df:return{name:Df,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case kf:return{name:kf,properties:[{name:`key`},{name:`value`}]};case jf:return{name:jf,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Nf:return{name:Nf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ff:return{name:Ff,properties:[{name:`subject`},{name:`where`}]};case Lf:return{name:Lf,properties:[{name:`custom`},{name:`subject`}]};case zf:return{name:zf,properties:[{name:`kind`}]};case Vf:return{name:Vf,properties:[{name:`key`},{name:`value`}]};case Uf:return{name:Uf,properties:[{name:`name`}]};case Gf:return{name:Gf,properties:[{name:`key`},{name:`value`}]};case qf:return{name:qf,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Yf:return{name:Yf,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Zf:return{name:Zf,properties:[{name:`key`},{name:`value`}]};case $f:return{name:$f,properties:[{name:`key`},{name:`value`}]};case tp:return{name:tp,properties:[{name:`color`},{name:`name`}]};case rp:return{name:rp,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case ap:return{name:ap,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case sp:return{name:sp,properties:[{name:`key`},{name:`value`}]};case lp:return{name:lp,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case dp:return{name:dp,properties:[{name:`key`},{name:`value`}]};case pp:return{name:pp,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case hp:return{name:hp,properties:[{name:`color`},{name:`tag`}]};case _p:return{name:_p,properties:[{name:`el`},{name:`parent`}]};case yp:return{name:yp,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Sp:return{name:Sp,properties:[{name:`tag`}]};case wp:return{name:wp,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Ep:return{name:Ep,properties:[{name:`key`},{name:`value`}]};case Op:return{name:Op,properties:[{name:`view`}]};case kp:return{name:kp,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case jp:return{name:jp,properties:[{name:`predicate`}]};case Np:return{name:Np,properties:[{name:`style`}]};case Fp:return{name:Fp,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Lp:return{name:Lp,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case zp:return{name:zp,properties:[{name:`targets`},{name:`value`}]};case Vp:return{name:Vp,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Up:return{name:Up,properties:[{name:`key`},{name:`value`}]};case Gp:return{name:Gp,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case qp:return{name:qp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yp:return{name:Yp,properties:[{name:`value`}]};case Zp:return{name:Zp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case $p:return{name:$p,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case tm:return{name:tm,properties:[{name:`value`}]};case rm:return{name:rm,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case am:return{name:am,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case sm:return{name:sm,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case lm:return{name:lm,properties:[{name:`isWildcard`,defaultValue:!1}]};case dm:return{name:dm,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case pm:return{name:pm,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const K=new hm;let gm;const _m=()=>gm??=Re(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@123"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/[_]*[a-zA-Z][-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),vm={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},ym={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},bm={AstReflection:()=>new hm},xm={Grammar:()=>_m(),LanguageMetaData:()=>vm,parser:{ParserConfig:()=>ym}};function Sm(e){return vm.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function Cm(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const wm=Zi(`/`);function Tm(e,t){return wm(e.uri.path,t.uri.path)}const Em=W.getChild(`chokidar`),Dm={fileSystemWatcher:e=>new km(e)},Om=e=>{let t=Yr(e);return Sm(t)||Bs(t)||dc(t)};var km=class{watcher;queue=new ar({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Em.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){Em.debug`create watcher for folder: ${e}`;let t=ir.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!Om(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Em.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Em.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=Yr(e),r=g.file(e);switch(!0){case Bs(n):Em.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case Sm(n):Em.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case dc(n):{Em.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.ownerProjectId(r);await t.ProjectsManager.rebuildProject(n);break}default:Em.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=Yr(e),r=g.file(e);switch(!0){case Bs(n):Em.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case Sm(n):Em.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case dc(n):{Em.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.ownerProjectId(r);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuildProject(n);break}default:Em.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Em.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},Am=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(cc(e))return Promise.resolve(ac);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},jm=class{watch(){}dispose(){return Promise.resolve()}},Mm=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const Nm={fileSystemWatcher:()=>new jm},Pm={fileSystemProvider:()=>new Am,...Nm},Fm={manualLayouts:()=>new Mm},Im=W.getChild(`filesystem`);function Lm(e,t=!1){return!t&&Bs(Yr(e))}function Rm(e,t=!1){return!t&&Sm(Yr(e))}const zm=(e=!0)=>({fileSystemProvider:()=>new Bm,...e?Dm:Nm});var Bm=class extends Je{async readFile(e){if(cc(e))return Promise.resolve(ac);try{return await super.readFile(e)}catch(t){return Im.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new ic.fdir().withSymlinks({resolvePaths:!1}).exclude(Cm).withFullPaths().filter(Rm);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:g.file(e)})}catch(t){Im.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(Tm)}async scanProjectFiles(e){return await this.scanDirectory(e,Lm)}async scanDirectory(e,t){let n=[];try{let r=await new ic.fdir().withSymlinks({resolvePaths:!1}).exclude(Cm).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:g.file(e)})}catch(t){Im.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await rc(e)}async writeFile(e,t){let n=Xr(e.fsPath),r=ii(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Im.debug(`creating directory {path}`,{path:n}),ri(n,{recursive:!0})),Im.debug(`writing file {path}`,{path:e.fsPath}),await ni(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=ii(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await ti(t),Im.debug(`deleted file {path}`,{path:t}),!0):(Im.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Im.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const Vm={mcpServer:()=>new Hm,mcpServerFactory:()=>new Um};var Hm=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},Um=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const Wm=W.getChild(`mcp`);function Gm(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},Km(n,e,t)]}function Km(e,t,n){let r=n.bind(null,t);return(async function(t,n){Wm.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return Wm.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:ci(t)}],isError:!0}}})}var qm=`1.50.0`,Jm=class extends He{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=me(e);let r=super.createDescription(e,t,n);return cc(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},Ym=class extends ke{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return re(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const Xm=Symbol.for(`idattr`),Zm={writeId(e,t){return e[Xm]=t,e},readId(e){return e[Xm]}},Qm={writeId(e,t){return S(t)?e[Xm]=void 0:e[Xm]=t,e},readId(e){return e[Xm]}};function $m(e){return e?.textDocument.languageId===vm.languageId}function eh(e){return e?.markdown||e?.text}function th(e){let t=parseFloat(e);return isNaN(t)?100:Qt(t,{min:0,max:100})}function nh({value:e}){return th(e)}function rh({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:F(e)}}function ih({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function ah(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Ll(r):{let e=oh(r);b(e)&&(n.color=e);break}case $d(r):n.line=r.value;break;case Nl(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function oh(e){return e?.themeColor??e?.customColor?.$refText}function sh(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function ch(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function lh(e){return te(e,e=>Rp(e)||cu(e)||Su(e))}const uh=e=>ff(e)||ku(e)||nd(e)||Gu(e)||gu(e)||Fu(e),dh=e=>mf(e)||ou(e)||Xl(e)||Qu(e)||Kl(e);function fh(e){for(;;){if(dh(e)||uh(e))return!1;if(Sd(e)||gf(e))return!0;if(e.$container)e=e.$container;else return!1}}function ph(e){for(;;){if(dh(e))return!1;if(uh(e))return!0;if(e.$container)e=e.$container;else return!1}}function mh(e){for(;;){if(uh(e))return!1;if(dh(e))return!0;if(e.$container)e=e.$container;else return!1}}const hh=Zi(`/`),gh=(e,t)=>hh(e.uri.path,t.uri.path),_h=e=>$m(e)&&lc(e);var vh=class extends ce{constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(gh);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);_h(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return _h(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return re(this.documentMap.values()).filter(e=>_h(e)&&!this.projectsManager.isExcluded(e))}get all(){return re(this.documentMap.values()).map(e=>(_h(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return re(this.documentMap.values()).filter(n=>_h(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return w(this.userDocuments.toArray(),x(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),At(T(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,_h(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},yh=t(nr(),1);const q=W.getChild(`projects`);function bh(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function xh(e){return bh(e)?e.uri.toString():typeof e==`string`?Sr(e)?e:g.file(e).toString():e.toString()}const Sh=Zi(`/`,!0),Ch=(e,t)=>Sh(_r(e.path),_r(t.path));function wh(e){return t=>e.startsWith(ea(t)?t:t.folder)}function Th(e,t){let n=ea(e)?e:e.folder,r=ea(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function Eh(...e){return rn(Th,e)}function Dh(e,t){return t.startsWith(e.folder)||e.includePaths?.some(wh(t))?!Oh(e,t):!1}function Oh(e,t){return e.exclude?.(Tr(t))??!1}function kh(...e){return rn(Dh,e)}function Ah(...e){return rn(Oh,e)}function jh(e){return e=xh(e),Cr(e)}const Mh={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,yh.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function Nh(e){return Mh.exclude(Tr(e))}function Ph(e){if(`configUri`in e){P(!An(e.configUri),`configUri is emptyish`);let t=g.isUri(e.configUri)?e.configUri:g.parse(xh(e.configUri)),n=jh(le.dirname(t));return{configUri:t,folder:n,folderUri:g.parse(n)}}P(!An(e.folderUri),`folderUri is emptyish`);let t=jh(e.folderUri),n=g.parse(t);return{configUri:le.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Fh=class e{static DefaultProjectId=Mh.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new Hn.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=le.joinPath(e,`.likec4rc`),r=jh(e);return{id:t,config:Mh.config,folder:r,folderUri:g.parse(r),configUri:n,exclude:Mh.exclude,includeConfig:Mh.includeConfig}}return N(this.#r.find(e=>e.id===t),`Project ${t} not found`)});#a=new Hn.default(e=>{let t=xh(e),n=this.#o.get(t);return n?Ah(n,t)?!this.#r.some(kh(t)):!1:Nh(t)});#o=new Hn.default(e=>{let t=wh(e);return this.#r.find(t)??this.#r.find(kh(e))??null});constructor(e){this.services=e,q.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return E(this.#r,1)?this.#r[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#n=void 0,!t||t===e.DefaultProjectId){q.debug`reset default project ID`,this.#t=void 0;return}P(this.#r.find(e=>e.id===t),`Project "${t}" not found`),q.debug`set default project ID to ${t}`,this.#t=t}}get default(){if(!this.#n){let t=this.defaultProjectId??e.DefaultProjectId;this.#n=this.#i.get(t)}return this.#n}get all(){if(E(this.#r,1)){let e=[...x(this.#r,T(`id`)),Mh.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[Mh.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId||this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){let t=Eh(jh(e));return this.#r.filter(e=>t(e)||!!e.includePaths&&!!mn(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#r.some(e=>t===e.id),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${x(this.#r,T(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return bh(t)&&cc(t)?!0:e.length===1?this.#a.get(xh(t)):Ah(this.#i.get(e[0]),xh(t))}isIncluded(t,n){let r=xh(n);return E(this.#r,1)?t===e.DefaultProjectId?!this.#o.get(r)&&!Nh(r):kh(this.#i.get(t),xh(n)):!Nh(r)}async registerConfigFile(e,t){if(Nh(xh(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${Mh.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!Fe(t))throw li(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Ms.validate(e.config),{configUri:r,folder:i,folderUri:a}=Ph(e),o=Ms.normalizeInclude(n.include),s=this.#r.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(s.id=this.uniqueProjectId(n.name),q.info`re-register ${s.id}`),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#r=w([...this.#r,s],Zt((e,t)=>Ch(e.folderUri,t.folderUri))),q.info`register ${s.id}`),this.updateIncludesExcludes(s),this.resetCaches(),this.#s?s:(this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>Fe(e)?Promise.reject(e):(q.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#o.get(xh(t))?.id??this.#t??e.DefaultProjectId}#s=null;async reloadProjects(e){return this.#s?(q.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(q.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(Fe(e)||q.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){q.warn(`Failed to reloadProjects, no workspace folders found`);return}q.debug`start reload projects`;let n=[];for(let e of t){let t=g.parse(e.uri);q.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)q.debug`found config ${le.relative(t,r.uri)}`,n.push(r.uri)}catch(e){q.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#r.length===0){q.warning(`No config files found`);return}q.warning(`No config files found, but {count} projects were registered before`,{count:this.#r.length})}n.sort(Ch);let r=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){q.warn(ci(t));let n=r.get(e.toString());n&&(q.debug`Update failed, restore project ${n.id}`,await this.registerProject(n))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(x(this.#r,T(`id`))),n=e;if(!t.has(n))return n;q.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){q.trace(`resetCaches`),this.#n=void 0,this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(t,n){let r=this.#r.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?q.info`Rebuilding all documents `:q.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=q.getChild(r.id),a=this.services.workspace.LangiumDocuments.resetProjectIds().filter(e=>kh(r,xh(e)));a.length!==0&&(i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})}))}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Me.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return q.warn(`Failed to get workspace URI, using default folder`,{error:e}),g.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){q.warn(ci(e))}}updateIncludesExcludes(e){let t=e.config;switch(!0){case S(t.exclude):e.exclude=Mh.exclude;break;case t.exclude&&E(t.exclude,1):e.exclude=(0,yh.default)(x(t.exclude,t=>(!vr(t)&&!t.startsWith(`**`)&&(t=xr(`**`,t)),wr(hr(e.folderUri.path,t)))),{contains:!0,dot:!0});break;default:delete e.exclude}let n=e.includeConfig.paths;if(!E(n,1))return delete e.includePaths,e;e.includePaths=x(n,t=>{let n=le.resolvePath(e.folderUri,t);return{uri:n,folder:jh(n)}}),q.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#r)n.id!==e.id&&(Eh(t,n)&&q.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{Eh(t,r)&&q.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}},Ih=class extends Ee{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=g.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){G(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){G(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(ac,g.parse(sc)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{W.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&W.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){W.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of an(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){W.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?W.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):W.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=le.basename(t.uri);return t.isDirectory?!Cm(r):t.isFile?(n.fileExtensions.includes(le.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&E(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();W.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),g.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Me.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};const Lh=A({name:k().describe(`Project identifier`),title:k().optional().describe(`Human-readable project title`),contactPerson:k().optional().describe(`Maintainer contact information`),metadata:mr(k(),dr()).optional().describe(`Custom project metadata as key-value pairs`),extends:sr([k(),j(k())]).optional().describe(`Style inheritance paths`),exclude:j(k()).optional().describe(`File exclusion patterns`),include:A({paths:j(k()).describe(`Include paths`),maxDepth:O().describe(`Maximum directory depth`),fileThreshold:O().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:A({outDir:k().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:A({hasTheme:cr().describe(`Whether theme customization is defined`),hasDefaults:cr().describe(`Whether default style values are defined`),hasCustomCss:cr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function Rh(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const zh=A({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k(),tags:j(k()),metadata:mr(sr([k(),j(k())])),includedInViews:j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function Bh(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Gh(e.views())}}function Vh(e,t,n,r,i,a){P(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...Bh(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const Hh=A({path:k().describe(`Path to the file`),range:A({start:A({line:O(),character:O()}),end:A({line:O(),character:O()})}).describe(`Range in the file`)}).nullable(),Uh=k().refine(e=>!0).optional().default(Fh.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),Wh=j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})),Gh=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),Kh=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:g.parse(r.uri).fsPath,range:r.range}:null}catch(e){return Wm.debug(`Failed to locate {params}`,{error:e,params:n}),null}},qh=zh.extend({description:k().nullable().describe(`Element description`),technology:k().nullable().describe(`Element technology`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),children:j(k()).describe(`Direct child element ids`),incomingCount:O().describe(`Number of incoming relationships`),outgoingCount:O().describe(`Number of outgoing relationships`)}),Jh=Gm({name:`batch-read-elements`,description:`
37
+ Read details of multiple elements in a single call, reducing round-trips.
38
+ Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
39
+
40
+ Request:
41
+ - ids: string[] — array of element ids (FQNs) to read (max 50)
42
+ - project: string (optional) — project id. Defaults to "default" if omitted.
43
+
44
+ Response (JSON object):
45
+ - elements: Array of element details, each with:
46
+ - id: string — element id (FQN)
47
+ - name: string — element name
48
+ - kind: string — element kind
49
+ - title: string — human-readable title
50
+ - description: string|null — optional description
51
+ - technology: string|null — optional technology
52
+ - tags: string[] — assigned tags
53
+ - metadata: Record<string, string | string[]> — element metadata
54
+ - shape: string — rendered shape
55
+ - color: string — rendered color
56
+ - children: string[] — direct child element ids
57
+ - incomingCount: number — number of incoming relationships
58
+ - outgoingCount: number — number of outgoing relationships
59
+ - includedInViews: View[] — views that include this element
60
+ - notFound: string[] — ids that were not found in the project
61
+
62
+ View (object) fields:
63
+ - id: string — view identifier
64
+ - title: string — view title
65
+ - type: "element" | "deployment" | "dynamic"
66
+
67
+ Notes:
68
+ - Read-only, idempotent, no side effects.
69
+ - Safe to call repeatedly.
70
+ - Maximum 50 element ids per call.
71
+ - Elements not found are listed in notFound array (not an error).
72
+ - More efficient than multiple read-element calls when you need summary data for many elements.
73
+
74
+ Example response:
75
+ {
76
+ "elements": [
77
+ {
78
+ "id": "shop.frontend",
79
+ "name": "frontend",
80
+ "kind": "container",
81
+ "title": "Frontend",
82
+ "description": "User-facing web app",
83
+ "technology": "React",
84
+ "tags": ["public"],
85
+ "metadata": { "owner": "web-team" },
86
+ "shape": "browser",
87
+ "color": "#2F80ED",
88
+ "children": ["shop.frontend.auth"],
89
+ "incomingCount": 2,
90
+ "outgoingCount": 3,
91
+ "includedInViews": [
92
+ { "id": "system-overview", "title": "System Overview", "type": "element" }
93
+ ]
94
+ }
95
+ ],
96
+ "notFound": []
97
+ }
98
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:j(k()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:Uh},outputSchema:{elements:j(qh),notFound:j(k()).describe(`Element ids that were not found`)}},async(e,t)=>{P(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...Bh(t),description:t.description.text,technology:t.technology,shape:t.shape,color:t.color,children:[...t.children()].map(e=>e.id),incomingCount:t.allIncoming.size,outgoingCount:t.allOutgoing.size})}return{elements:i,notFound:a}}),Yh=A({id:k(),kind:k(),title:k(),description:k().nullable(),technology:k().nullable(),shape:k(),color:k()}),Xh=A({element1:Yh,element2:Yh,propertyDiffs:j(A({property:k().describe(`Property name`),element1Value:k().nullable().describe(`Value in element1`),element2Value:k().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:A({onlyInElement1:j(k()).describe(`Tags present only in element1`),onlyInElement2:j(k()).describe(`Tags present only in element2`),common:j(k()).describe(`Tags present in both elements`)}),metadata:A({onlyInElement1:mr(sr([k(),j(k())])).describe(`Metadata keys only in element1`),onlyInElement2:mr(sr([k(),j(k())])).describe(`Metadata keys only in element2`),different:j(A({key:k(),element1Value:sr([k(),j(k())]),element2Value:sr([k(),j(k())])})).describe(`Metadata keys present in both but with different values`),common:mr(sr([k(),j(k())])).describe(`Metadata keys with identical values in both`)}),relationships:A({incomingOnlyElement1:O().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:O().describe(`Count of unique source elements sending to element2 only`),incomingShared:O().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:O().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:O().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:O().describe(`Count of unique target elements receiving from both`)})}),Zh=Gm({name:`element-diff`,description:`
99
+ Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
100
+
101
+ Request:
102
+ - element1Id: string — first element id (FQN)
103
+ - element2Id: string — second element id (FQN)
104
+ - project: string (optional) — project id. Defaults to "default" if omitted.
105
+
106
+ Response (JSON object):
107
+ - element1: object — snapshot of first element (id, kind, title, description, technology, shape, color)
108
+ - element2: object — snapshot of second element
109
+ - propertyDiffs: Array of { property, element1Value, element2Value } — properties that differ
110
+ - tags: object
111
+ - onlyInElement1: string[] — tags only in element1
112
+ - onlyInElement2: string[] — tags only in element2
113
+ - common: string[] — tags in both
114
+ - metadata: object
115
+ - onlyInElement1: Record — metadata keys only in element1
116
+ - onlyInElement2: Record — metadata keys only in element2
117
+ - different: Array of { key, element1Value, element2Value } — keys present in both but with different values
118
+ - common: Record — metadata keys with identical values in both
119
+ - relationships: object — relationship count comparison
120
+ - incomingOnlyElement1/incomingOnlyElement2/incomingShared
121
+ - outgoingOnlyElement1/outgoingOnlyElement2/outgoingShared
122
+
123
+ Notes:
124
+ - Read-only, idempotent, no side effects.
125
+ - Safe to call repeatedly.
126
+ - Both elements must exist in the same project.
127
+ - Useful for comparing similar nodes to understand why they have different configurations.
128
+
129
+ Example response:
130
+ {
131
+ "element1": { "id": "planner.nodeA", "kind": "cgf-node", "title": "nodeA", ... },
132
+ "element2": { "id": "planner.nodeB", "kind": "cgf-node", "title": "nodeB", ... },
133
+ "propertyDiffs": [
134
+ { "property": "title", "element1Value": "nodeA :dwNodeTypeA", "element2Value": "nodeB :dwNodeTypeB" }
135
+ ],
136
+ "tags": {
137
+ "onlyInElement1": ["target_asil_qm"],
138
+ "onlyInElement2": ["target_asil_asil_b"],
139
+ "common": ["is_in_dag", "process_camera_master"]
140
+ },
141
+ "metadata": {
142
+ "onlyInElement1": {},
143
+ "onlyInElement2": {},
144
+ "different": [
145
+ { "key": "target_asil", "element1Value": "QM", "element2Value": "ASIL-B" }
146
+ ],
147
+ "common": { "host": "machine0" }
148
+ },
149
+ "relationships": {
150
+ "incomingOnlyElement1": 2,
151
+ "incomingOnlyElement2": 1,
152
+ "incomingShared": 3,
153
+ "outgoingOnlyElement1": 0,
154
+ "outgoingOnlyElement2": 1,
155
+ "outgoingShared": 2
156
+ }
157
+ }
158
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:k().describe(`First element id (FQN)`),element2Id:k().describe(`Second element id (FQN)`),project:Uh},outputSchema:Xh.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);P(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);P(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},ee={},te=[],ne={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?ee[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?ne[e]=t:te.push({key:e,element1Value:t,element2Value:n}))}let re=new Set([...i.incoming()].map(e=>e.source.id)),ie=new Set([...a.incoming()].map(e=>e.source.id)),ae=new Set([...i.outgoing()].map(e=>e.target.id)),oe=new Set([...a.outgoing()].map(e=>e.target.id)),se=0,ce=0,le=0;for(let e of re)ie.has(e)?se++:ce++;for(let e of ie)re.has(e)||le++;let ue=0,de=0,fe=0;for(let e of ae)oe.has(e)?ue++:de++;for(let e of oe)ae.has(e)||fe++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:ee,different:te,common:ne},relationships:{incomingOnlyElement1:ce,incomingOnlyElement2:le,incomingShared:se,outgoingOnlyElement1:de,outgoingOnlyElement2:fe,outgoingShared:ue}}}),Qh=Gm({name:`find-relationship-paths`,description:`
159
+ Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
160
+
161
+ Request:
162
+ - sourceId: string — source element FQN
163
+ - targetId: string — target element FQN
164
+ - maxDepth: number (optional, default: 3, max: 5) — maximum path length (number of hops)
165
+ - includeIndirect: boolean (optional, default: false) — include indirect (implied) relationships through nested elements
166
+ - project: string (optional) — project id. Defaults to "default" if omitted.
167
+
168
+ Algorithm:
169
+ - Uses breadth-first search (BFS) to find all paths
170
+ - Prevents cycles with visited set per path
171
+ - Paths are sorted by length (shortest first)
172
+ - Limited to 100 paths to avoid overwhelming responses
173
+
174
+ Response (JSON object):
175
+ - paths: Array of path objects, each with:
176
+ - length: number — number of hops in the path
177
+ - steps: Array<Step> — ordered sequence of relationships
178
+
179
+ Step (object) fields:
180
+ - source: string — source element FQN
181
+ - target: string — target element FQN
182
+ - relationship: object
183
+ - kind: string|null — relationship kind
184
+ - title: string|null — relationship title
185
+ - description: string|null — relationship description
186
+ - technology: string|null — relationship technology
187
+ - tags: string[] — relationship tags
188
+
189
+ Notes:
190
+ - Read-only, idempotent, no side effects.
191
+ - Safe to call repeatedly.
192
+ - Returns empty paths array if no paths exist.
193
+ - Rejects if source equals target.
194
+ - includeIndirect=false (default): only follows direct relationships on each element.
195
+ includeIndirect=true: also follows implied relationships through nested elements.
196
+ - maxDepth is capped at 5 to prevent excessive computation.
197
+ - Paths are discovered iteratively and sorted by length.
198
+
199
+ Example response:
200
+ {
201
+ "paths": [
202
+ {
203
+ "length": 1,
204
+ "steps": [
205
+ {
206
+ "source": "shop.frontend",
207
+ "target": "shop.backend",
208
+ "relationship": {
209
+ "kind": "uses",
210
+ "title": "Calls API",
211
+ "description": null,
212
+ "technology": "HTTPS",
213
+ "tags": []
214
+ }
215
+ }
216
+ ]
217
+ },
218
+ {
219
+ "length": 2,
220
+ "steps": [
221
+ {
222
+ "source": "shop.frontend",
223
+ "target": "shop.cache",
224
+ "relationship": {
225
+ "kind": "uses",
226
+ "title": "Reads from",
227
+ "description": null,
228
+ "technology": "Redis",
229
+ "tags": []
230
+ }
231
+ },
232
+ {
233
+ "source": "shop.cache",
234
+ "target": "shop.backend",
235
+ "relationship": {
236
+ "kind": "syncs-with",
237
+ "title": "Updates",
238
+ "description": null,
239
+ "technology": null,
240
+ "tags": []
241
+ }
242
+ }
243
+ ]
244
+ }
245
+ ]
246
+ }
247
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:k().describe(`Source element FQN`),targetId:k().describe(`Target element FQN`),maxDepth:O().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:cr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:Uh},outputSchema:{paths:j(A({length:O().describe(`Number of hops in the path`),steps:j(A({source:k().describe(`Source element FQN`),target:k().describe(`Target element FQN`),relationship:A({kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);P(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);P(a,`Target element "${t.targetId}" not found in project "${n}"`),P(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}});var $h=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=ho(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=ca(r)):(this.imported=null,this.hierarchyLevel=ca(this.id))}get name(){return ia(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!Nt(this.$element.summary,this.$element.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$element))}get description(){return Xo.memoize(this,`description`,Za(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>wa(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=ua(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?_a([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return b(wa(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!wt(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},eg=class{Aux;get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return ia(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Xo.memoize(this,`summary`,Xa(this.$node))}get description(){return Xo.memoize(this,`description`,Za(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=ua(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>ag.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>ag.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!wt(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},tg=class extends eg{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=ca(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=wa(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return Ia(t,e)}},ng=class extends eg{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=ca(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get summary(){return Xo.memoize(this,`summary`,Xa(this.$instance)??Xa(this.element.$element))}get description(){return Xo.memoize(this,`description`,Za(this.$instance)??Za(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},rg=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},ig=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=ua(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return b(this.$relationship.title)?this.$relationship.title:null}get technology(){return An(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Nt(this.$relationship.summary,this.$relationship.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$relationship))}get description(){return Xo.memoize(this,`description`,Za(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!wt(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},ag=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(Ia(this.model,t.model),Ia(this.deployment,t.deployment))}difference(t){return e.from(z(this.model,t.model),z(this.deployment,t.deployment))}union(t){return e.from(Fa(this.model,t.model),Fa(this.deployment,t.deployment))}};const J=e=>typeof e==`string`?e:e.id,og=e=>{if(P(!e.includes(`
248
+ `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return E(t,1)?t:[``]}return[e.trim()]},sg=e=>og(e).join(`/`),cg=e=>{let t=og(e);return E(t,2)?t.slice(0,-1).join(`/`):null},lg=e=>e.includes(`/`)?og(e).pop()??e:e.trim();var ug=class{#e=new Map;#t=new Map;#n=new Hn.default(()=>new Set);#r=new Hn.default(()=>new Set);#i=new Set;#a=new Map;#o=new Hn.default(()=>new Set);#s=new Hn.default(()=>new Set);#c=new Hn.default(()=>new Set);#l=new Hn.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=yn(t.elements);for(let e of ga(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of yn(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof tg||e instanceof ng)return e;let t=J(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=J(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(V.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return va(this.#u,`${t}@${n}`,()=>new rg(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=J(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=J(e);return this.#t.get(t)||null}children(e){let t=J(e);return this.#n.get(t)}*siblings(e){let t=J(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=J(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=J(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=J(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=Co(e)?new tg(this,Object.freeze(e)):new ng(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=ra(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new ig(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...da(n)])this.#c.get(e).add(t);for(let e of da(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of da(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},dg=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(V.flatten(t.source)),this.target=e.element(V.flatten(t.target));let n=ua(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return An(this.$relationship.title)?null:this.$relationship.title}get technology(){return An(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Nt(this.$relationship.summary,this.$relationship.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$relationship))}get description(){return Xo.memoize(this,`description`,Za(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!wt(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},fg=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Xo.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?vo(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return _o(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},pg=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Xo.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Xo.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return b(this.$node.modelRef)}hasDeployment(){return b(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return uo(this.$node)}isTagged(e){return this.tags.includes(e)}},mg=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new Hn.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new pg(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new fg(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?lg(n.title):null,this.viewPath=n.title?sg(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[ro]}get stage(){return this.#e[no]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Xo.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>Qs(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Ys(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=J(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(J(e))??null}findNodeWithElement(e){let t=J(e);return this.#i.has(t)?xa(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=J(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(J(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(J(e))}includesDeployment(e){return this.#a.has(J(e))}includesRelation(e){return this.#o.has(J(e))}isComputed(){return this.#e[no]===`computed`}isLayouted(){return this.#e[no]===`layouted`}isDiagram(){return this.#e[no]===`layouted`}isElementView(){return this.#e[ro]===`element`}isScopedElementView(){return this.#e[ro]===`element`&&b(this.#e.viewOf)}isDeploymentView(){return this.#e[ro]===`deployment`}isDynamicView(){return this.#e[ro]===`dynamic`}},hg=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Ft(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),An(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof mg&&e.push(t);return e})}},gg=class e{Aux;_elements=new Map;_parents=new Map;_children=new Hn.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new Hn.default(()=>new Set);_outgoing=new Hn.default(()=>new Set);_internal=new Hn.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new Hn.default(()=>new Set);_allTags=new Hn.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[no]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of on(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of on(e.imports??{}))for(let e of ga(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of yn(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new ug(this),to(e,`computed`)||to(e,`layouted`)){let t=Zi(`/`),n=w(yn(e.views),x(e=>({view:e,path:sg(e.title??e.id),folderPath:e.title&&cg(e.title)||``})),Zt((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ln(e,`/`);P(E(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new hg(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ln(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(wt(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new mg(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new hg(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>$o.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[no]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof $h)return e;let t=J(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(J(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=J(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(J(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=J(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=J(e);return this._parents.get(t)||null}children(e){let t=J(e);return this._children.get(t)}*siblings(e){let t=J(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=J(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=J(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=J(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>Zt([...this._allTags.keys()],Xi))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>w([...this._allTags.entries()],x(([e,t])=>({tag:e,count:t.size,tagged:t})),Zt((e,t)=>Xi(e.tag,t.tag)),wn([T(`count`),`desc`])))}findByTag(e,t){return ba(this._allTags.get(e),e=>t===`elements`?e instanceof $h:t===`views`?e instanceof mg:t===`relationships`?e instanceof dg:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=jo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=jo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new $h(this,Object.freeze(e));this._elements.set(t.id,t);let n=ra(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!mo(t.id),`Imported element already has global FQN`);let n=po(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new $h(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=ra(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=ra(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new dg(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=ua(n.id,r.id);if(i)for(let e of[i,...da(i)])this._internal.get(e).add(t);for(let e of da(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of da(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=gg.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(gg||={});let _g;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(_g||={});const vg=Symbol.for(`nodejs.util.inspect.custom`);var yg=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Va(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[vg](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
249
+ `)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&La(this.relations.model,t.relations.model)&&La(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new ag(t.model??new Set,t.deployment??new Set):this.relations)}};function bg(e,t){if(!t){let t=e;return e=>bg(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function xg(e,t){let n=t;for(let t of e)bg(t,n)&&(n=t);return n===t?null:n}function Sg(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Cg(e,t){if(!e||ea(e)){let t=e??`asc`;return e=>wg(e,t)}return wg(e,t??`asc`)}function wg(e,t){return w(e,x(e=>({id:Sg(e),conn:e})),_a(t),x(e=>e.conn))}function Tg(e,t){return e.filter(e=>bg(t,e))}function Eg(e,t){return e.filter(bg(t))}function Dg(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Og(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function kg(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Ag(e,t){if(!t){let t=e;return e=>Ag(e,t)}let n=e;return sa(n.source,t)&&!sa(n.target,t)}function jg(e,t){if(!t){let t=e;return e=>jg(e,t)}let n=e;return sa(n.target,t)&&!sa(n.source,t)}function Mg(e,t){if(!t){let t=e;return e=>Mg(e,t)}let n=e;return sa(n.source,t)!==sa(n.target,t)}var Ng=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Va(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&Da(this.relations,kt(kg(this)))}get directRelations(){return new Set(ba(this.relations,kg(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,Fa(this.relations,t.relations))}difference(t){return new e(this.source,this.target,z(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,Ia(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&La(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[vg](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
250
+ `)}reversed(){return new e(this.target,this.source)}},Pg=e({findConnection:()=>Fg,findConnectionsBetween:()=>Ig,findConnectionsWithin:()=>Lg});function Fg(e,t,n=`directed`){if(e===t||oa(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new yg(e,t,r)]:[];return n===`directed`?i:[...i,...Fg(t,e,`directed`)]}function Ig(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Fg(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Lg(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Ig(t,r.slice(n+1),`both`)),e),[])}var Rg=e({findConnection:()=>zg,findConnectionsBetween:()=>Bg,findConnectionsWithin:()=>Vg});function zg(e,t,n=`directed`){if(e===t||oa(e,t))return[];let r=Ia(e.allOutgoing,t.allIncoming),i=r.size>0?new Ng(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=Ia(e.allIncoming,t.allOutgoing),o=a.size>0?new Ng(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function Bg(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of zg(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Vg(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Bg(t,r.slice(n+1),`both`)),e),[])}function Hg(e){return e instanceof tg}function Ug(e){return e instanceof ng}function Wg(e){return Hg(e)||Ug(e)}function Gg(e){return e instanceof rg}function Kg(e){return e instanceof $h}const qg=A({id:k(),title:k(),kind:k()}),Jg=A({type:ur([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:qg,target:qg,kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`),includedInViews:Wh.describe(`Views that include this relationship`),sourceLocation:Hh}),Yg=Gm({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
38
251
  Find relationships between two LikeC4 elements within a project.
39
252
 
40
253
  What it does:
@@ -105,7 +318,7 @@ Response:
105
318
  }
106
319
  ]
107
320
  }
108
- `,inputSchema:{element1:y().describe(`Element ID (FQN)`),element2:y().describe(`Element ID (FQN)`),project:Kh},outputSchema:{found:b(Zh)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Vi(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);P(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);P(o,`Element "${t.element2}" not found in project "${n}"`);let s=Yh(e,n),c=th(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:Jh(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),$h=fm({name:`list-projects`,description:`
321
+ `,inputSchema:{element1:k().describe(`Element ID (FQN)`),element2:k().describe(`Element ID (FQN)`),project:Uh},outputSchema:{found:j(Jg)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(oa(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);P(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);P(o,`Element "${t.element2}" not found in project "${n}"`);let s=Kh(e,n),c=zg(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:Gh(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),Xg=Gm({name:`list-projects`,description:`
109
322
  List LikeC4 projects discoverable in the current workspace.
110
323
 
111
324
  Request:
@@ -138,7 +351,7 @@ Example response:
138
351
  }
139
352
  ]
140
353
  }
141
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:b(x({id:y(),title:y(),folder:y(),sources:b(y())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),eg=fm({name:`open-view`,description:`
354
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:j(A({id:k(),title:k(),folder:k(),sources:j(k())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),Zg=Gm({name:`open-view`,description:`
142
355
  Open a LikeC4 view in the editor's preview panel.
143
356
 
144
357
  Request:
@@ -159,7 +372,378 @@ Example response:
159
372
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
160
373
  }
161
374
  }
162
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:y().describe(`View id (name)`),project:Kh},outputSchema:{location:Gh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:Yh(e,n)({view:r.id})}}),tg=fm({name:`read-deployment`,description:`
375
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:k().describe(`View id (name)`),project:Uh},outputSchema:{location:Hh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:Kh(e,n)({view:r.id})}}),Qg=ur([`exact`,`contains`,`exists`]),$g=Gm({name:`query-by-metadata`,description:`
376
+ Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
377
+
378
+ Request:
379
+ - key: string — metadata key to filter by
380
+ - value: string (optional) — metadata value to match (ignored for 'exists' mode)
381
+ - matchMode: "exact" | "contains" | "exists" (optional, default: "exact")
382
+ - project: string (optional) — project id. Defaults to "default" if omitted.
383
+
384
+ Match Modes:
385
+ - exact: Value must match exactly (case-sensitive)
386
+ Example: key="owner", value="platform-team" matches only exact "platform-team"
387
+ - contains: Value contains the search string (case-insensitive)
388
+ Example: key="technology", value="aws" matches "AWS Lambda", "aws-s3", etc.
389
+ - exists: Element has the key (value parameter is ignored)
390
+ Example: key="owner" returns all elements with any "owner" metadata
391
+
392
+ Response (JSON object):
393
+ - results: Array of matching elements/deployment-nodes, each with:
394
+ - id: string — element/node id (FQN)
395
+ - name: string — element/node name
396
+ - kind: string — element/node kind
397
+ - title: string — human-readable title
398
+ - tags: string[] — assigned tags
399
+ - metadata: Record<string, string | string[]> — all element metadata
400
+ - matchedValue: string — the metadata value that matched (for reference)
401
+ - includedInViews: View[] — views that include this element
402
+
403
+ View (object) fields:
404
+ - id: string — view identifier
405
+ - title: string — view title
406
+ - type: "element" | "deployment" | "dynamic"
407
+
408
+ Notes:
409
+ - Read-only, idempotent, no side effects.
410
+ - Safe to call repeatedly.
411
+ - Handles both string and array metadata values.
412
+ - For array values, matches if any element in the array matches.
413
+ - Returns empty array if no matches found.
414
+ - Limited to 50 results to avoid overwhelming responses.
415
+ - Case-sensitive for exact mode, case-insensitive for contains mode.
416
+
417
+ Example response:
418
+ {
419
+ "results": [
420
+ {
421
+ "id": "shop.frontend",
422
+ "name": "frontend",
423
+ "kind": "container",
424
+ "title": "Frontend",
425
+ "tags": ["public"],
426
+ "metadata": {
427
+ "owner": "platform-team",
428
+ "tier": "critical"
429
+ },
430
+ "matchedValue": "platform-team",
431
+ "includedInViews": [
432
+ {
433
+ "id": "system-overview",
434
+ "title": "System Overview",
435
+ "type": "element"
436
+ }
437
+ ]
438
+ }
439
+ ]
440
+ }
441
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:k().describe(`Metadata key to filter by`),value:k().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Qg.optional().default(`exact`).describe(`Matching mode`),project:Uh},outputSchema:{results:j(zh.extend({matchedValue:k().describe(`The metadata value that matched`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],o=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},s=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...Bh(e),matchedValue:s(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...Bh(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),e_=Gm({name:`query-by-tag-pattern`,description:`
442
+ Search elements by tag patterns using prefix or substring matching.
443
+ Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
444
+
445
+ Request:
446
+ - pattern: string — tag pattern to match
447
+ - matchMode: "prefix" | "contains" | "suffix" (optional, default: "prefix")
448
+ - prefix: matches tags starting with the pattern (e.g., "target_asil" matches "target_asil_qm", "target_asil_asil_b")
449
+ - contains: matches tags containing the pattern anywhere (e.g., "asil" matches "target_asil_qm", "unit_asil_b")
450
+ - suffix: matches tags ending with the pattern (e.g., "_tbc" matches "target_asil_qm__tbc")
451
+ - project: string (optional) — project id. Defaults to "default" if omitted.
452
+
453
+ Response (JSON object):
454
+ - results: Array of matching elements, each with:
455
+ - id: string — element id (FQN)
456
+ - name: string — element name
457
+ - kind: string — element kind
458
+ - title: string — human-readable title
459
+ - tags: string[] — all assigned tags
460
+ - metadata: Record<string, string | string[]> — element metadata
461
+ - matchedTags: string[] — the specific tags that matched the pattern
462
+ - includedInViews: View[] — views that include this element
463
+ - truncated: boolean — true if results were truncated due to exceeding the 50-result limit
464
+ - matchedTagValues: string[] — all unique tag values that matched the pattern across all elements
465
+
466
+ View (object) fields:
467
+ - id: string — view identifier
468
+ - title: string — view title
469
+ - type: "element" | "deployment" | "dynamic"
470
+
471
+ Notes:
472
+ - Read-only, idempotent, no side effects.
473
+ - Safe to call repeatedly.
474
+ - Pattern matching is case-insensitive.
475
+ - Returns empty array if no matches found.
476
+ - Limited to 50 results.
477
+ - matchedTagValues provides a summary of all distinct matching tag values found.
478
+
479
+ Example response:
480
+ {
481
+ "results": [
482
+ {
483
+ "id": "top.planner.behaviorNode",
484
+ "name": "behaviorNode",
485
+ "kind": "cgf-node",
486
+ "title": "behaviorNode :dwBehaviorPlannerNode",
487
+ "tags": ["is_in_dag", "target_asil_qm", "process_camera_master"],
488
+ "metadata": {},
489
+ "matchedTags": ["target_asil_qm"],
490
+ "includedInViews": []
491
+ }
492
+ ],
493
+ "truncated": false,
494
+ "matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
495
+ }
496
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:k().min(1).describe(`Tag pattern to match`),matchMode:ur([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:Uh},outputSchema:{results:j(zh.extend({matchedTags:j(k()).describe(`Tags that matched the pattern`)})),truncated:cr().describe(`True if results were truncated`),matchedTagValues:j(k()).describe(`All unique tag values matching the pattern across all elements`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),a=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},o=[],s=!1,c=new Set;for(let e of r.elements()){let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...Bh(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!Hg(e))continue;let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...Bh(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),t_=Gm({name:`query-by-tags`,description:`
497
+ Advanced tag filtering with boolean logic (AND, OR, NOT).
498
+
499
+ Request:
500
+ - allOf: string[] (optional) — element must have ALL these tags (AND logic)
501
+ - anyOf: string[] (optional) — element must have ANY of these tags (OR logic)
502
+ - noneOf: string[] (optional) — element must have NONE of these tags (NOT logic)
503
+ - project: string (optional) — project id. Defaults to "default" if omitted.
504
+
505
+ Boolean Logic:
506
+ - All three conditions are combined with AND logic
507
+ - At least one condition must be specified
508
+ - Tags are case-sensitive
509
+
510
+ Example Queries:
511
+ - Public APIs: {"allOf": ["public", "api"]}
512
+ - Deprecated or legacy: {"anyOf": ["deprecated", "legacy"]}
513
+ - Public but not deprecated: {"allOf": ["public"], "noneOf": ["deprecated"]}
514
+ - Critical services not in migration: {"allOf": ["critical", "service"], "noneOf": ["migration", "deprecated"]}
515
+
516
+ Response (JSON object):
517
+ - results: Array of matching elements/deployment-nodes, each with:
518
+ - id: string — element/node id (FQN)
519
+ - name: string — element/node name
520
+ - kind: string — element/node kind
521
+ - title: string — human-readable title
522
+ - tags: string[] — assigned tags (for reference)
523
+ - metadata: Record<string, string | string[]> — element metadata
524
+ - includedInViews: View[] — views that include this element
525
+
526
+ View (object) fields:
527
+ - id: string — view identifier
528
+ - title: string — view title
529
+ - type: "element" | "deployment" | "dynamic"
530
+
531
+ Notes:
532
+ - Read-only, idempotent, no side effects.
533
+ - Safe to call repeatedly.
534
+ - Returns empty array if no matches found.
535
+ - Limited to 50 results to avoid overwhelming responses.
536
+ - Conflicting conditions (e.g., allOf and noneOf with same tag) will return no results.
537
+
538
+ Example response:
539
+ {
540
+ "results": [
541
+ {
542
+ "id": "shop.api",
543
+ "name": "api",
544
+ "kind": "container",
545
+ "title": "API Gateway",
546
+ "tags": ["public", "api", "critical"],
547
+ "metadata": {
548
+ "owner": "platform-team"
549
+ },
550
+ "includedInViews": [
551
+ {
552
+ "id": "system-overview",
553
+ "title": "System Overview",
554
+ "type": "element"
555
+ }
556
+ ]
557
+ }
558
+ ]
559
+ }
560
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:j(k()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:j(k()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:j(k()).optional().describe(`Element must have NONE of these tags (NOT)`),project:Uh},outputSchema:{results:j(zh),truncated:cr().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{P(t.allOf&&t.allOf.length>0||t.anyOf&&t.anyOf.length>0||t.noneOf&&t.noneOf.length>0,`At least one condition (allOf, anyOf, or noneOf) must be specified with at least one tag`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,o=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}o(e.tags)&&i.push(Bh(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}Hg(e)&&o(e.tags)&&i.push(Bh(e))}return{results:i,truncated:a}}),n_=ur([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),r_=Gm({name:`query-graph`,description:`
561
+ Query element hierarchy and relationships in the architecture graph.
562
+
563
+ Request:
564
+ - elementId: string — element id (FQN) to query
565
+ - queryType: "ancestors" | "descendants" | "siblings" | "children" | "parent" | "incomers" | "outgoers"
566
+ - includeIndirect: boolean (optional, default: true) — for incomers/outgoers, include indirect relationships (through nested elements)
567
+ - project: string (optional) — project id. Defaults to "default" if omitted.
568
+
569
+ Query Types:
570
+ - ancestors: Returns all parent elements up to the root (hierarchical)
571
+ Example: shop.frontend.auth.service returns [shop.frontend.auth, shop.frontend, shop]
572
+ - descendants: Returns all child elements recursively (hierarchical)
573
+ Example: shop.frontend returns all nested elements like shop.frontend.auth, shop.frontend.auth.service
574
+ - siblings: Returns elements at the same hierarchy level with the same parent
575
+ Example: shop.frontend returns [shop.backend, shop.database] if they're siblings
576
+ - children: Returns direct child elements only (not recursive)
577
+ Example: shop returns [shop.frontend, shop.backend] but not shop.frontend.auth
578
+ - parent: Returns the direct parent element
579
+ Example: shop.frontend.auth returns shop.frontend
580
+ - incomers: Returns elements that have outgoing relationships to this element (single hop, not recursive).
581
+ For recursive upstream traversal, use query-incomers-graph instead.
582
+ includeIndirect=true: Includes relationships to nested children
583
+ Example: Elements that depend on this element
584
+ - outgoers: Returns elements that receive incoming relationships from this element (single hop, not recursive).
585
+ For recursive downstream traversal, use query-outgoers-graph instead.
586
+ includeIndirect=true: Includes relationships from nested children
587
+ Example: Elements this element depends on
588
+
589
+ Response (JSON object):
590
+ - results: Array of elements (max 100), each with:
591
+ - id: string — element id (FQN)
592
+ - name: string — element name
593
+ - kind: string — element kind
594
+ - title: string — human-readable title
595
+ - tags: string[] — assigned tags
596
+ - metadata: Record<string, string> — element metadata
597
+ - includedInViews: View[] — views that include this element
598
+ - truncated: boolean — true if results were truncated due to exceeding maximum limit (100)
599
+
600
+ View (object) fields:
601
+ - id: string — view identifier
602
+ - title: string — view title
603
+ - type: "element" | "deployment" | "dynamic"
604
+
605
+ Notes:
606
+ - Read-only, idempotent, no side effects.
607
+ - Safe to call repeatedly.
608
+ - For parent query on root element, returns empty array.
609
+ - For hierarchical queries (ancestors, descendants, siblings, children), includeIndirect is ignored.
610
+
611
+ Example response:
612
+ {
613
+ "results": [
614
+ {
615
+ "id": "shop.frontend",
616
+ "name": "frontend",
617
+ "kind": "container",
618
+ "title": "Frontend",
619
+ "tags": ["public"],
620
+ "metadata": { "owner": "web-team" },
621
+ "includedInViews": [
622
+ {
623
+ "id": "system-overview",
624
+ "title": "System Overview",
625
+ "type": "element"
626
+ }
627
+ ]
628
+ }
629
+ ],
630
+ "truncated": false
631
+ }
632
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:k().describe(`Element id (FQN) to query`),queryType:n_.describe(`Type of graph query`),includeIndirect:cr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:Uh},outputSchema:{results:j(zh),truncated:cr().describe(`True if results were truncated due to exceeding maximum limit`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(Bh(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(Bh(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(Bh(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(Bh(e))}break;case`parent`:{let e=r.parent;e&&i.push(Bh(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(Bh(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(Bh(t))}break}}return{results:i,truncated:a}}),i_=A({elementId:k().describe(`ID of the incoming element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),a_=Gm({name:`query-incomers-graph`,description:`
633
+ Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
634
+
635
+ This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
636
+ indirectly provide input to the target element. It returns the complete subgraph in a single response,
637
+ making it much more efficient than repeated individual queries.
638
+
639
+ Request:
640
+ - elementId: string — target element id (FQN) to start from
641
+ - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
642
+ - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
643
+ - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
644
+ - project: string (optional) — project id. Defaults to "default" if omitted.
645
+
646
+ Response Structure:
647
+ {
648
+ "target": "element.id",
649
+ "totalNodes": number,
650
+ "maxDepth": number,
651
+ "truncated": boolean,
652
+ "nodes": {
653
+ "element.id": {
654
+ "id": "element.id",
655
+ "name": "name",
656
+ "kind": "kind",
657
+ "title": "title",
658
+ "tags": ["tag1", "tag2"],
659
+ "metadata": {},
660
+ "includedInViews": [...],
661
+ "incomers": [
662
+ {
663
+ "elementId": "id1",
664
+ "relationshipLabel": "uses",
665
+ "technology": "REST"
666
+ }
667
+ ],
668
+ "depth": number
669
+ }
670
+ }
671
+ }
672
+
673
+ Use Cases:
674
+ - Find all producers/dependencies for an element
675
+ - Trace data lineage upstream
676
+ - Identify root causes and dependencies
677
+ - Build complete dependency trees
678
+ - Answer "what feeds into this?" questions
679
+
680
+ Notes:
681
+ - Read-only, idempotent, no side effects
682
+ - Cycle detection prevents infinite loops
683
+ - Result size limited to maxNodes to prevent huge responses
684
+ - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
685
+
686
+ Example:
687
+ For a database element, this returns all services, APIs, and components that write to it,
688
+ plus all their dependencies, recursively up to maxDepth levels.
689
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query incomers for`),includeIndirect:cr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:O().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:O().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Uh},outputSchema:{target:k().describe(`Target element id`),totalNodes:O().describe(`Total number of nodes in the graph`),maxDepth:O().describe(`Maximum depth reached`),truncated:cr().describe(`True if result was truncated due to maxNodes limit`),nodes:mr(zh.extend({incomers:j(i_).describe(`Incoming relationships with details`),depth:O().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=Vh(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),o_=A({elementId:k().describe(`ID of the outgoing element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),s_=Gm({name:`query-outgoers-graph`,description:`
690
+ Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
691
+
692
+ This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
693
+ indirectly consume output from the target element. It returns the complete subgraph in a single response,
694
+ making it much more efficient than repeated individual queries.
695
+
696
+ Request:
697
+ - elementId: string — target element id (FQN) to start from
698
+ - includeIndirect: boolean (optional, default: true) — include relationships through nested elements
699
+ - maxDepth: number (optional, default: 10, max: 50) — maximum traversal depth to prevent infinite recursion
700
+ - maxNodes: number (optional, default: 200, max: 2000) — maximum number of nodes to return
701
+ - project: string (optional) — project id. Defaults to "default" if omitted.
702
+
703
+ Response Structure:
704
+ {
705
+ "target": "element.id",
706
+ "totalNodes": number,
707
+ "maxDepth": number,
708
+ "truncated": boolean,
709
+ "nodes": {
710
+ "element.id": {
711
+ "id": "element.id",
712
+ "name": "name",
713
+ "kind": "kind",
714
+ "title": "title",
715
+ "tags": ["tag1", "tag2"],
716
+ "metadata": {},
717
+ "includedInViews": [...],
718
+ "outgoers": [
719
+ {
720
+ "elementId": "id1",
721
+ "relationshipLabel": "sends data to",
722
+ "technology": "Kafka"
723
+ }
724
+ ],
725
+ "depth": number
726
+ }
727
+ }
728
+ }
729
+
730
+ Use Cases:
731
+ - Find all consumers/dependents of an element
732
+ - Trace data lineage downstream
733
+ - Assess impact of changes (blast radius)
734
+ - Build complete consumer trees
735
+ - Answer "what depends on this?" questions
736
+
737
+ Notes:
738
+ - Read-only, idempotent, no side effects
739
+ - Cycle detection prevents infinite loops
740
+ - Result size limited to maxNodes to prevent huge responses
741
+ - If truncated=true, increase maxNodes or reduce maxDepth to get more specific results
742
+
743
+ Example:
744
+ For an API service, this returns all clients, services, and systems that consume its output,
745
+ plus all their consumers, recursively up to maxDepth levels.
746
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:cr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:O().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:O().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Uh},outputSchema:{target:k().describe(`Target element id`),totalNodes:O().describe(`Total number of nodes in the graph`),maxDepth:O().describe(`Maximum depth reached`),truncated:cr().describe(`True if result was truncated due to maxNodes limit`),nodes:mr(zh.extend({outgoers:j(o_).describe(`Outgoing relationships with details`),depth:O().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=Vh(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),c_=Gm({name:`read-deployment`,description:`
163
747
  Read details about a deployment node or a deployed instance in a LikeC4 project.
164
748
 
165
749
  What it does:
@@ -224,7 +808,7 @@ Example response (deployed instance):
224
808
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
225
809
  }
226
810
  }
227
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:y().describe(`Deployment id (FQN)`),project:Kh},outputSchema:{type:st([`deployment-node`,`deployed-instance`]),id:y().describe(`Deployment id (FQN)`),kind:y().describe(`Deployment node kind, or element kind for deployed instances`),name:y(),title:y(),description:y().nullable(),technology:y().nullable(),tags:b(y()),project:y(),metadata:dt(at([y(),b(y())])),links:b(x({title:y().nullable().describe(`Optional link title`),url:y().describe(`Link URL`),relative:y().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:y(),color:y(),children:b(y()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:qh.describe(`Views that include this deployment node`),instanceof:x({id:y().describe(`Element ID (FQN)`),title:y(),kind:y()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:Gh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);P(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=Yh(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:Jh(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),ng=fm({name:`read-element`,description:`
811
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:k().describe(`Deployment id (FQN)`),project:Uh},outputSchema:{type:ur([`deployment-node`,`deployed-instance`]),id:k().describe(`Deployment id (FQN)`),kind:k().describe(`Deployment node kind, or element kind for deployed instances`),name:k(),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:mr(sr([k(),j(k())])),links:j(A({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:k(),color:k(),children:j(k()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:Wh.describe(`Views that include this deployment node`),instanceof:A({id:k().describe(`Element ID (FQN)`),title:k(),kind:k()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:Hh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);P(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=Kh(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:Gh(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),l_=Gm({name:`read-element`,description:`
228
812
  Read detailed information about a LikeC4 element.
229
813
 
230
814
  Request:
@@ -311,7 +895,7 @@ Example response:
311
895
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
312
896
  }
313
897
  }
314
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:y().describe(`Element id (FQN)`),project:Kh},outputSchema:{id:y().describe(`Element id (FQN)`),kind:y().describe(`Element kind`),name:y().describe(`Element name`),title:y(),description:y().nullable(),technology:y().nullable(),tags:b(y()),project:y(),metadata:dt(at([y(),b(y())])),links:b(x({title:y().nullable().describe(`Optional link title`),url:y().describe(`Link URL`),relative:y().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:y(),color:y(),children:b(y()).describe(`Children of this element (Array of FQNs)`),defaultView:y().nullable().describe(`Name of the default view of this element`),includedInViews:qh.describe(`Views that include this element`),relationships:x({incoming:b(x({source:x({id:y(),title:y(),kind:y()}).describe(`Source element of this relationship`),kind:y().nullable().describe(`Relationship kind`),target:y().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:y().nullable().describe(`Relationship title`),description:y().nullable().describe(`Relationship description`),technology:y().nullable().describe(`Relationship technology`),tags:b(y()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:b(x({source:y().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:x({id:y(),title:y(),kind:y()}).describe(`Target element of this relationship`),kind:y().nullable().describe(`Relationship kind`),title:y().nullable().describe(`Relationship title`),description:y().nullable().describe(`Relationship description`),technology:y().nullable().describe(`Relationship technology`),tags:b(y()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:b(y()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:Gh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);P(r,`Element "${t.id}" not found in project "${n}"`);let i=Yh(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:Jh(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),rg=fm({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
898
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:k().describe(`Element id (FQN)`),project:Uh},outputSchema:{id:k().describe(`Element id (FQN)`),kind:k().describe(`Element kind`),name:k().describe(`Element name`),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:mr(sr([k(),j(k())])),links:j(A({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:k(),color:k(),children:j(k()).describe(`Children of this element (Array of FQNs)`),defaultView:k().nullable().describe(`Name of the default view of this element`),includedInViews:Wh.describe(`Views that include this element`),relationships:A({incoming:j(A({source:A({id:k(),title:k(),kind:k()}).describe(`Source element of this relationship`),kind:k().nullable().describe(`Relationship kind`),target:k().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:j(A({source:k().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:A({id:k(),title:k(),kind:k()}).describe(`Target element of this relationship`),kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:j(k()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:Hh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);P(r,`Element "${t.id}" not found in project "${n}"`);let i=Kh(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:Gh(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),u_=Gm({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
315
899
  Request:
316
900
  - project: string (optional) — project id. Defaults to "default" if omitted.
317
901
 
@@ -319,6 +903,16 @@ Response (JSON object):
319
903
  - title: string — human-readable project title
320
904
  - folder: string — absolute path to the project root
321
905
  - sources: string[] — absolute file paths of model documents
906
+ - config: object — project configuration
907
+ - name: string — project identifier
908
+ - title?: string — human-readable title
909
+ - contactPerson?: string — maintainer contact
910
+ - metadata?: object — custom project metadata as key-value pairs
911
+ - extends?: string | string[] — style inheritance paths
912
+ - exclude?: string[] — file exclusion patterns
913
+ - include?: object — include configuration (paths, maxDepth, fileThreshold)
914
+ - manualLayouts?: object — manual layouts config (outDir)
915
+ - styles?: object — simplified styles (hasTheme, hasDefaults, hasCustomCss)
322
916
  - specification: object
323
917
  - elementKinds: string[] — all element kinds
324
918
  - relationshipKinds: string[] — all relationship kinds
@@ -355,6 +949,11 @@ Example response:
355
949
  "sources": [
356
950
  "/abs/path/to/workspace/examples/cloud-system/model.c4"
357
951
  ],
952
+ "config": {
953
+ "name": "cloud-boutique",
954
+ "title": "Cloud Boutique",
955
+ "contactPerson": "admin@example.com"
956
+ },
358
957
  "specification": {
359
958
  "elementKinds": ["system", "container", "component"],
360
959
  "relationshipKinds": ["uses", "depends-on"],
@@ -381,13 +980,13 @@ Example response:
381
980
  ],
382
981
  "views": [
383
982
  {
384
- "name": "system-overview",
983
+ "id": "system-overview",
385
984
  "title": "System Overview",
386
985
  "type": "element"
387
986
  }
388
987
  ]
389
988
  }
390
- `,inputSchema:{project:Kh},outputSchema:{title:y(),folder:y(),sources:b(y()),specification:x({elementKinds:b(y()),relationshipKinds:b(y()),deploymentKinds:b(y()),tags:b(y()),metadataKeys:b(y())}),elements:b(x({id:y(),kind:y(),title:y(),tags:b(y())})).describe(`List of elements in the project`),deployments:b(rt(`type`,[x({type:lt(`deployment-node`),id:y().describe(`Node ID`),kind:y().describe(`Deployment node kind`),title:y().describe(`Node title`),tags:b(y())}),x({type:lt(`deployed-instance`),id:y().describe(`Node ID`),title:y().describe(`Node title`),tags:b(y()),referencedElementId:y().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:b(x({id:y(),title:y(),type:st([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,specification:{elementKinds:Et(i.specification.elements),relationshipKinds:Et(i.specification.relationships),deploymentKinds:Et(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),sources:r.documents?.map(e=>e.fsPath)??[]}}),ig=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,ag=rt(`type`,[x({type:lt(`element`),id:y().describe(`Node ID`),elementId:y().describe(`Element ID (FQN)`),kind:y().describe(`Element kind`),title:y().describe(`Node title`),description:y().nullable(),technology:y().nullable(),children:b(y()).describe(`Children nodes, array of node IDs`),shape:y().describe(`Rendered shape`),color:y().describe(`Rendered color`),tags:b(y())}),x({type:lt(`deployment-node`),id:y().describe(`Node ID`),deploymentId:y().describe(`Deployment entity ID (FQN)`),kind:y().describe(`Deployment kind`),title:y().describe(`Node title`),description:y().nullable(),technology:y().nullable(),children:b(y()).describe(`Children nodes, array of node IDs`),shape:y().describe(`Rendered shape`),color:y().describe(`Rendered color`),tags:b(y())}),x({type:lt(`deployed-instance`),id:y().describe(`Node ID`),deploymentId:y().describe(`Deployment entity ID (FQN)`),title:y().describe(`Node title`),description:y().nullable(),technology:y().nullable(),referencedElement:x({id:y().describe(`Element ID (FQN)`),kind:y().describe(`Element kind`),title:y().describe(`Element title`)}),shape:y().describe(`Rendered shape`),color:y().describe(`Rendered color`),tags:b(y())})]),og=fm({name:`read-view`,description:`
989
+ `,inputSchema:{project:Uh},outputSchema:{title:k(),folder:k(),sources:j(k()),config:Lh.describe(`Project configuration`),specification:A({elementKinds:j(k()),relationshipKinds:j(k()),deploymentKinds:j(k()),tags:j(k()),metadataKeys:j(k())}),elements:j(A({id:k(),kind:k(),title:k(),tags:j(k())})).describe(`List of elements in the project`),deployments:j(or(`type`,[A({type:fr(`deployment-node`),id:k().describe(`Node ID`),kind:k().describe(`Deployment node kind`),title:k().describe(`Node title`),tags:j(k())}),A({type:fr(`deployed-instance`),id:k().describe(`Node ID`),title:k().describe(`Node title`),tags:j(k()),referencedElementId:k().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:j(A({id:k(),title:k(),type:ur([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:Rh(r.config),specification:{elementKinds:cn(i.specification.elements),relationshipKinds:cn(i.specification.relationships),deploymentKinds:cn(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),d_=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,f_=or(`type`,[A({type:fr(`element`),id:k().describe(`Node ID`),elementId:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),A({type:fr(`deployment-node`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),kind:k().describe(`Deployment kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),A({type:fr(`deployed-instance`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),referencedElement:A({id:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Element title`)}),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())})]),p_=Gm({name:`read-view`,description:`
391
990
  Read detailed information about a LikeC4 view.
392
991
 
393
992
  Request:
@@ -435,7 +1034,7 @@ Example response:
435
1034
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
436
1035
  }
437
1036
  }
438
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:y().describe(`View id (name)`),project:Kh},outputSchema:{id:y(),type:st([`element`,`deployment`,`dynamic`]).describe(`View type`),title:y(),description:y().nullable(),tags:b(y()),project:y(),nodes:b(ag),edges:b(x({source:y().describe(`Source node`),target:y().describe(`Target node`),label:y().nullable(),description:y().nullable(),technology:y().nullable(),tags:b(y())})).describe(`Edge represents relationship between nodes`),sourceLocation:Gh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=Yh(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>ig(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),sg=b(rt(`type`,[x({type:lt(`element`),project:y().describe(`Project ID`),id:y().describe(`Element ID (FQN)`),name:y().describe(`Element name`),kind:y(),title:y(),technology:y().nullable(),shape:y(),includedInViews:qh,metadata:dt(at([y(),b(y())])),tags:b(y())}),x({type:lt(`deployment-node`),project:y().describe(`Project ID`),id:y().describe(`Deployment ID (FQN)`),name:y().describe(`Deployment name`),kind:y(),title:y(),technology:y().nullable(),shape:y(),includedInViews:qh,metadata:dt(at([y(),b(y())])),tags:b(y())})])),cg=fm({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1037
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:k().describe(`View id (name)`),project:Uh},outputSchema:{id:k(),type:ur([`element`,`deployment`,`dynamic`]).describe(`View type`),title:k(),description:k().nullable(),tags:j(k()),project:k(),nodes:j(f_),edges:j(A({source:k().describe(`Source node`),target:k().describe(`Target node`),label:k().nullable(),description:k().nullable(),technology:k().nullable(),tags:j(k())})).describe(`Edge represents relationship between nodes`),sourceLocation:Hh}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=Kh(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>d_(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),m_=j(or(`type`,[A({type:fr(`element`),project:k().describe(`Project ID`),id:k().describe(`Element ID (FQN)`),name:k().describe(`Element name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:Wh,metadata:mr(sr([k(),j(k())])),tags:j(k())}),A({type:fr(`deployment-node`),project:k().describe(`Project ID`),id:k().describe(`Deployment ID (FQN)`),name:k().describe(`Deployment name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:Wh,metadata:mr(sr([k(),j(k())])),tags:j(k())})])),h_=Gm({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
439
1038
  Search LikeC4 elements and deployment nodes across all projects.
440
1039
 
441
1040
  Query syntax (case-insensitive):
@@ -490,7 +1089,73 @@ Example response:
490
1089
  }
491
1090
  ]
492
1091
  }
493
- `,inputSchema:{search:y().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:it(),found:sg}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),dm.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),dm.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),dm.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),dm.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(dm.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of ta(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Jh(e.views())});for(let e of ta(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Jh(e.views())})}catch(e){dm.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}});var lg=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new ct({name:`LikeC4`,version:mm},{instructions:`LikeC4 MCP query and navigate LikeC4 models.
1092
+ `,inputSchema:{search:k().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:O(),found:m_}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),Wm.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),Wm.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),Wm.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),Wm.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(Wm.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of ba(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Gh(e.views())});for(let e of ba(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Gh(e.views())})}catch(e){Wm.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),g_=A({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k().describe(`Human-readable title`),depth:O().describe(`Depth relative to the root element (1 = direct child)`),tags:j(k()).describe(`Assigned tags`),metadata:mr(sr([k(),j(k())])).describe(`Element metadata`),childCount:O().describe(`Number of direct children`),incomingCount:O().describe(`Number of incoming relationships`),outgoingCount:O().describe(`Number of outgoing relationships`)}),__=Gm({name:`subgraph-summary`,description:`
1093
+ Get a compact, table-friendly summary of all descendants of a parent element.
1094
+ Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
1095
+ Much more efficient than calling read-element for each descendant individually.
1096
+
1097
+ Request:
1098
+ - elementId: string — parent element id (FQN) whose descendants to summarize
1099
+ - maxDepth: number (optional, default: 10, max: 20) — maximum depth of descendants to include
1100
+ - metadataKeys: string[] (optional) — if provided, only include these metadata keys in the response (reduces response size)
1101
+ - project: string (optional) — project id. Defaults to "default" if omitted.
1102
+
1103
+ Response (JSON object):
1104
+ - root: object — the root element summary
1105
+ - id: string — element id
1106
+ - kind: string — element kind
1107
+ - title: string — element title
1108
+ - childCount: number — number of direct children
1109
+ - descendants: Array of descendant summaries, each with:
1110
+ - id: string — element id (FQN)
1111
+ - name: string — element name
1112
+ - kind: string — element kind
1113
+ - title: string — human-readable title
1114
+ - depth: number — depth relative to root (1 = direct child)
1115
+ - tags: string[] — assigned tags
1116
+ - metadata: Record<string, string | string[]> — element metadata (filtered by metadataKeys if provided)
1117
+ - childCount: number — number of direct children
1118
+ - incomingCount: number — number of incoming relationships
1119
+ - outgoingCount: number — number of outgoing relationships
1120
+ - totalDescendants: number — total number of descendants (may differ from array length if truncated)
1121
+ - truncated: boolean — true if results were truncated due to exceeding the 200-result limit
1122
+ - truncatedByDepth: boolean — true if deeper descendants exist beyond maxDepth
1123
+
1124
+ Notes:
1125
+ - Read-only, idempotent, no side effects.
1126
+ - Safe to call repeatedly.
1127
+ - Limited to 200 descendants in the response.
1128
+ - Use metadataKeys to reduce response size when you only need specific metadata.
1129
+ - Descendants are returned in breadth-first order (closest to root first).
1130
+ - depth=1 means direct child, depth=2 means grandchild, etc.
1131
+
1132
+ Example response:
1133
+ {
1134
+ "root": {
1135
+ "id": "top.planner",
1136
+ "kind": "subsystem",
1137
+ "title": "Planner Subsystem",
1138
+ "childCount": 5
1139
+ },
1140
+ "descendants": [
1141
+ {
1142
+ "id": "top.planner.nodeA",
1143
+ "name": "nodeA",
1144
+ "kind": "cgf-node",
1145
+ "title": "nodeA :dwNodeTypeA",
1146
+ "depth": 1,
1147
+ "tags": ["is_in_dag", "target_asil_qm"],
1148
+ "metadata": { "target_asil": "QM", "safety_info_unit_asil": "QM" },
1149
+ "childCount": 0,
1150
+ "incomingCount": 3,
1151
+ "outgoingCount": 2
1152
+ }
1153
+ ],
1154
+ "totalDescendants": 5,
1155
+ "truncated": false,
1156
+ "truncatedByDepth": false
1157
+ }
1158
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:k().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:O().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:j(k()).optional().describe(`If provided, only include these metadata keys in the response`),project:Uh},outputSchema:{root:A({id:k(),kind:k(),title:k(),childCount:O()}),descendants:j(g_),totalDescendants:O().describe(`Total number of descendants found`),truncated:cr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:cr().describe(`True if deeper descendants exist beyond maxDepth`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});var v_=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new lr({name:`LikeC4`,version:qm},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
494
1159
 
495
1160
  Conventions:
496
1161
  - All tools are read-only and idempotent.
@@ -498,12 +1163,22 @@ Conventions:
498
1163
 
499
1164
  Available tools:
500
1165
  - list-projects — List all LikeC4 projects in the workspace.
501
- - read-project-summary — Project specification (element kinds, deployment node kinds, tags, metadata keys), all elements, deployment nodes and views. Input: { project? }.
1166
+ - read-project-summary — Project specification, configuration, all elements, deployment nodes and views. Input: { project? }.
502
1167
  - search-element — Search elements and deployment nodes across all projects by id/title/kind/shape/tags/metadata. Input: { search }.
503
1168
  - read-element — Full element details including relationships, includedInViews, deployedInstances, metadata and sourceLocation. Input: { id, project? }.
504
1169
  - read-deployment — Details of a deployment node or deployed instance. Input: { id, project? }.
505
1170
  - read-view — Full view details (nodes/edges) and sourceLocation. Input: { viewId, project? }.
506
1171
  - find-relationships — Direct and indirect relationships between two elements in a project. Input: { element1, element2, project? }.
1172
+ - query-graph — Query element hierarchy (ancestors, descendants, siblings, children, parent) and relationships (incomers, outgoers). Input: { elementId, queryType, includeIndirect?, project? }.
1173
+ - query-incomers-graph — Get complete graph of all upstream dependencies/producers (recursive incomers). Much more efficient than repeated query-graph calls. Input: { elementId, includeIndirect?, maxDepth?, maxNodes?, project? }.
1174
+ - query-outgoers-graph — Get complete graph of all downstream consumers/dependents (recursive outgoers). Much more efficient than repeated query-graph calls. Input: { elementId, includeIndirect?, maxDepth?, maxNodes?, project? }.
1175
+ - query-by-metadata — Search elements by metadata key-value pairs with exact/contains/exists matching. Input: { key, value?, matchMode?, project? }.
1176
+ - query-by-tags — Advanced tag filtering with boolean logic (allOf, anyOf, noneOf). Input: { allOf?, anyOf?, noneOf?, project? }.
1177
+ - find-relationship-paths — Discover all paths (chains of relationships) between two elements with BFS traversal. Input: { sourceId, targetId, maxDepth?, includeIndirect?, project? }.
1178
+ - batch-read-elements — Read details of multiple elements in a single call, reducing round-trips. Input: { ids, project? }.
1179
+ - query-by-tag-pattern — Search elements by tag prefix/contains/suffix patterns. Input: { pattern, matchMode?, project? }.
1180
+ - element-diff — Compare two elements side-by-side showing differences in properties, tags, metadata, and relationships. Input: { element1Id, element2Id, project? }.
1181
+ - subgraph-summary — Compact summary of all descendants of a parent element with metadata, tags, and relationship counts. Input: { elementId, maxDepth?, metadataKeys?, project? }.
507
1182
  ${t?`- open-view — Opens the LikeC4 view panel in the editor. Triggers UI; at most one preview panel at a time. Input: { viewId, project? }.`:``}
508
1183
 
509
1184
  Instructions:
@@ -514,43 +1189,48 @@ Instructions:
514
1189
  - If response returns "sourceLocation", provide link to this location in the editor
515
1190
 
516
1191
  Full documentation: https://likec4.dev/llms-full.txt
517
- `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},...e?.capabilities}});return n.registerTool(...$h(this.services.likec4.LanguageServices)),n.registerTool(...rg(this.services.likec4.LanguageServices)),n.registerTool(...ng(this.services.likec4.LanguageServices)),n.registerTool(...tg(this.services.likec4.LanguageServices)),n.registerTool(...og(this.services.likec4.LanguageServices)),n.registerTool(...cg(this.services.likec4.LanguageServices)),n.registerTool(...Qh(this.services.likec4.LanguageServices)),t&&n.registerTool(...eg(this.services.likec4.LanguageServices)),n.server.onerror=e=>{W.error(M(e))},n}},ug=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(dm.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new ot,await this._mcp.connect(this.transport),dm.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{dm.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function dg(e){let t=e.create(),n=new ut({sessionIdGenerator:()=>dr()}),r=new lr;return r.use(`*`,ur({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),r.get(`/health`,e=>e.json({status:`ok`})),r.all(`/mcp`,e=>n.handleRequest(e.req.raw)),r.notFound(e=>(dm.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),r.onError((e,t)=>(dm.error(M(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),await t.connect(n),r}async function fg(e){let{factory:t,port:n}=e,r=await dg(t);return new Promise((e,t)=>{let i=cr({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var pg=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}dm.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await fg({factory:this.services.mcp.ServerFactory,port:e}),dm.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(dm.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?dm.error(`Failed to stop MCP server`,{err:e}):dm.info(`MCP server stopped`),t()})})):(dm.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function mg(e,t=33335){dm.debug(`Creating StreamableLikeC4MCPServer`);let n=new pg(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){dm.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=M(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),dm.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function hg(e){return new ug(e)}function gg(e=`sse`){return{mcpServer:t=>e===`stdio`?hg(t):mg(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new lg(e)}}const _g={top:50,right:40,bottom:40,left:40};function vg(e,t){let n=e.nodes.map(e=>{let n=t.nodes[e.id];if(!n)return e;let{x:r,y:i,width:a,height:o}=n;return{...e,width:a,height:o,x:r,y:i}}),r=e.edges.map(e=>{let n=t.edges[e.id];return n?{...e,...n}:e});return{...e,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},nodes:n,edges:r}}function yg(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(e.hash===t.hash||wg(e,t))return Sg(e.nodes.filter(e=>!e.parent),n,t),vg(e,t);e.hasLayoutDrift=!0;let r=Na.merge(...e.nodes.map(e=>t.nodes[e.id]).filter(e=>!!e));return e.nodes.filter(e=>e.parent==null).reduce((e,r)=>bg(r,e,n,t),{x:r.x,y:r.y+r.height+100}),e.edges.filter(e=>!t.edges[e.id]).forEach(e=>xg(e,t)),vg(e,t)}function bg(e,t,n,r){let i=r.nodes[e.id],a=i?.isCompound??!1,o=!i,s=o?t:{x:i.x,y:i.y},c=e.children.map(e=>r.nodes[e]).filter(e=>!!e),l=c.length>0&&Na.merge(...c),u=a&&l?{x:l.x,y:l.y+l.height+100}:{x:s.x+_g.left,y:s.y+_g.top};return e.children.map(e=>n.get(e)).reduce((e,t)=>bg(t,e,n,r),u),i=e.children.length>0?Cg(e,r):r.nodes[e.id]??{isCompound:!1,width:e.width,height:e.height,x:s.x,y:s.y},r.nodes[e.id]=i,o?{x:i.x+i.width+100,y:i.y}:t}function xg(e,t){let n=t.nodes[e.source],r=t.nodes[e.target],i=Tg(Na.center(n)),a=Tg(Na.center(r)),o=a.subtract(i),{x:s,y:c}=o.divide(2).add(i),l={...e?.labelBBox??{width:0,height:0},x:s,y:c},u=o.multiply(.7).add(i),d=o.multiply(.3).add(i);t.edges[e.id]={points:[[i.x,i.y],[d.x,d.y],[u.x,u.y],[a.x,a.y]],labelBBox:l,controlPoints:[u]}}function Sg(e,t,n){e.filter(e=>e.children.length>0).forEach(e=>{Sg(e.children.map(e=>t.get(e)).filter(e=>!!e),t,n),n.nodes[e.id]=Cg(e,n)})}function Cg(e,t){let n=Na.merge(...e.children.map(e=>t.nodes[e]));return{isCompound:!0,x:n.x-_g.left,y:n.y-_g.top,width:n.width+_g.left+_g.right,height:n.height+_g.top+_g.bottom}}function wg(e,t){let n=e=>e.children.length>0;return Yn(e.autoLayout,t.autoLayout)&&e.nodes.every(e=>{let r=t.nodes[e.id];return!!r&&n(e)===r.isCompound})&&e.edges.every(e=>!!t.edges[e.id])}function Tg({x:e,y:t}){return new Fa(e,t)}function Eg(e){return T(e,sn(e=>e.parallelPrefix??void 0),gn((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),cn())}function Dg(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new Tn.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=Tn.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var Og=class{#e=new gr;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,pr.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of Eg(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,pr.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,pr.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,pr.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(gt(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return C(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,pr.strong).before(i),this.put(s,pr.strong).before(r),this.put(c,pr.strong).after(a.right),this.put(l,pr.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=_n(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new fr;return this.#e.addEditVariable(t,pr.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,pr.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,pr.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,pr.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,pr.weak);break}}constraint(e,t,n=void 0,r=pr.medium){let i;switch(t){case`==`:i=hr.Eq;break;case`>=`:i=hr.Ge;break;case`<=`:i=hr.Le;break;case`== 0`:i=hr.Eq,n=0;break;case`>= 0`:i=hr.Ge,n=0;break;case`<= 0`:i=hr.Le,n=0;break;default:F(t)}this.#e.addConstraint(new mr(e,i,n??0,r))}put(e,t=pr.required){let n=t===pr.required?pr.medium:pr.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function kg(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>Xa(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(O(i,1),`actors array must not be empty`);let a=new Dn.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=Co(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new Og({actors:i,steps:o,compounds:Dg(i,e.nodes)}),l=c.getViewBounds(),u=T(c.getCompoundBoxes(),C(({node:e,...t})=>({...t,id:e.id,origin:e.id})),St(`id`),gn((e,t)=>O(e,2)?C(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),cn(),ft());return{actors:i.map(e=>Ag({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:C(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function Ag({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}function jg(e){return e.children.length>0}function Mg(e){switch(e){case`open`:return`vee`;default:return e}}function Ng(e){return Array.isArray(e)?[Ng(e[0]),Ng(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const Pg=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),Y=e=>Math.ceil(e/72*1e3)/1e3,Fg=e=>Math.ceil(e);Fg(40).toString();function Ig(e,t){return xr(Sr(e,{l:-35-5*t,s:-15-5*t}))}function Lg(e){return xr(br(e,.3))}var Rg=t(yr(),1);function zg(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Bg(e,{maxchars:t,maxLines:n,sanitize:r=Nt()}){let i=(0,Rg.default)(e,{width:t,indent:``,escape:r}).split(`
518
- `);return mt(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Vg({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Bg(e,{maxchars:t,maxLines:r,sanitize:zg}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${Fg(n)}"${s}>${o}</FONT>`}function Hg(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Ug(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=D(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[Vg({text:e.title,fontsize:r.textSize,maxchars:Hg(n),maxLines:a?1:3})];if(n!==`xs`){D(e.technology?.trim())&&l.push(Vg({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Ao.from(e.description).text;t&&l.push(Vg({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function Wg(e,t){let n=Vg({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Gg=`BGCOLOR="${No.DEFAULT.relationshipColors.labelBg}A0"`;function Kg({label:e,technology:t}){let n=[];return D(e?.trim())&&n.push(Vg({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),D(t?.trim())&&n.push(Vg({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Gg}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function qg(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Gg}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${Fg(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return D(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Gg} CELLPADDING="3">`,Vg({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Jg=`dashed`,Yg=`Arial`,Xg=ti(`dot`),Zg=50.1;var Qg=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Cr({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(jg).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=Wi(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(jg(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(jg(t))w(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return vr(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=_r({[j.likec4_viewId]:this.view.id,[j.bgcolor]:`transparent`,[j.layout]:`dot`,[j.compound]:!0,[j.rankdir]:e.direction,[j.TBbalance]:`min`,[j.splines]:`spline`,[j.outputorder]:`nodesfirst`,[j.nodesep]:Y(e.nodeSep??110),[j.ranksep]:Y(e.rankSep??120),[j.pad]:Y(15),[j.fontname]:Yg});return t.attributes.graph.apply({[j.fontsize]:Fg(this.styles.fontSize()),[j.labeljust]:e.direction===`RL`?`r`:`l`,[j.labelloc]:e.direction===`BT`?`b`:`t`,[j.margin]:Zg}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[j.fontname]:Yg,[j.shape]:`rect`,[j.fillcolor]:t.fill,[j.fontcolor]:t.hiContrast,[j.color]:t.stroke,[j.style]:`filled`,[j.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[j.arrowsize]:.75,[j.fontname]:Yg,[j.fontsize]:Fg(14),[j.penwidth]:Fg(2),[j.color]:t.line,[j.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=jg(e),n=zi(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=zi(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(jg(e),`node should be compound`),P(Tt(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=Lg(n.loContrast);return t.apply({[j.likec4_id]:e.id,[j.likec4_level]:e.level,[j.likec4_depth]:e.depth,[j.fillcolor]:Ig(n.fill,e.depth),[j.color]:Ig(n.stroke,e.depth),[j.style]:`filled`,[j.margin]:Fg(e.children.length>1?40:32)}),A(e.title.trim())||t.set(j.label,Wg(e,r)),t}elementToNode(e,t){P(!jg(e),`node should not be compound`);let n=D(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style);switch(t.attributes.apply({[j.likec4_id]:e.id,[j.likec4_level]:e.level,[j.label]:Ug(e,this.styles),[j.margin]:`${Y(n?8:i)},${Y(i)}`}),t.attributes.set(j.width,Y(a)),t.attributes.set(j.height,Y(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[j.fillcolor]:r.fill,[j.fontcolor]:r.hiContrast,[j.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[j.margin]:`${Y(n?8:i)},${Y(0)}`,[j.penwidth]:Fg(2),[j.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[j.margin]:`${Y(n?8:i+4)},${Y(i+6)}`});break;case`mobile`:t.attributes.apply({[j.margin]:`${Y(n?8:i+4)},${Y(i)}`});break;case`queue`:t.attributes.apply({[j.width]:Y(a),[j.height]:Y(o-8),[j.margin]:`${Y(n?8:i+4)},${Y(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!jg(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return jg(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(jg(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return T(this.descendants(e),Dt(e=>mn(e.inEdges,e.outEdges)),Rt(),un(mn(t.inEdges,t.outEdges)),C(e=>this.view.edges.find(t=>t.id===e)),k(D))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=T(this.view.nodes,k(jg),C(e=>e.id),Ht(qi),Gt(),C(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),k(({edges:e})=>e.length>1&&e.length<8),Vt(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(j.group,n.id),i.attributes.set(j.group,n.id)}catch(e){Xg.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=Y(i.center.x)+n,o=Y(e-i.center.y);i.fixedsize?t.attributes.apply({[j.pos]:`${a},${o}!`,[j.pin]:!0,[j.width]:Y(i.fixedsize.width),[j.height]:Y(i.fixedsize.height),[j.fixedsize]:!0}):t.attributes.set(j.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(j.weight),e.attributes.delete(j.minlen),e.attributes.delete(j.constraint);return this.graphvizModel.apply({[j.layout]:`fdp`,[j.overlap]:`vpsc`,[j.sep]:`+50,50`,[j.esep]:`+10,10`,[j.start]:`random2`,[j.splines]:`compound`,[j.K]:10}),this.graphvizModel.delete(j.compound),this.graphvizModel.delete(j.rankdir),this.graphvizModel.delete(j.nodesep),this.graphvizModel.delete(j.ranksep),this.graphvizModel.delete(j.pack),this.graphvizModel.delete(j.pad),this.graphvizModel.delete(j.packmode),this.graphvizModel.attributes.graph.delete(j.margin),this}},$g=class extends Qg{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(j.TBbalance),e.apply({[j.nodesep]:Y(t.nodeSep??130),[j.ranksep]:Y(t.rankSep??130)}),e}postBuild(e){T(this.view.nodes,C(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),sn(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),cn(),C(e=>e),It(t=>{t.length<2||e.subgraph({[j.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),rn(()=>{e.set(j.newrank,!0),e.set(j.clusterrank,`global`),e.delete(j.pack),e.delete(j.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(j.margin,Fg(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>gt(e)),[s,c,l]=this.edgeEndpoint(r,Wt),u=bt(l)||bt(o),d=t.edge([a,c],{[j.likec4_id]:e.id,[j.style]:e.line??Jg});l&&d.attributes.set(j.lhead,l),o&&d.attributes.set(j.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(j.weight,f);let p=Kg(e);if(p&&d.attributes.set(u?j.xlabel:j.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[j.color]:t.line,[j.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[j.arrowtail]:`none`,[j.arrowhead]:`none`,[j.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[j.arrowhead]:Mg(m),[j.arrowtail]:Mg(e.tail??m),[j.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(j.constraint,!1),d):(m&&d.attributes.set(j.arrowhead,Mg(m)),h!==`none`&&d.attributes.set(j.arrowtail,Mg(h)),d)}},e_=class extends Qg{postBuild(e){e.delete(j.TBbalance),e.set(j.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>gt(e)),[c,l,u]=this.edgeEndpoint(i,Wt),d=t.edge([o,l],{[j.likec4_id]:e.id,[j.style]:e.line??Jg});if(u&&d.attributes.set(j.lhead,u),s&&d.attributes.set(j.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[j.color]:t.line,[j.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(D).join(`
519
- `),p=qg(Za(e.id),f);d.attributes.set(j.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[j.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[j.arrowtail]:Mg(h),[j.dir]:`back`}),g!==`none`&&d.attributes.apply({[j.arrowhead]:Mg(g),[j.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[j.arrowhead]:Mg(h),[j.arrowtail]:Mg(g),[j.dir]:`both`}),d):h===`none`?(d.attributes.delete(j.arrowhead),d.attributes.apply({[j.arrowtail]:Mg(g),[j.minlen]:0,[j.dir]:`back`}),d):(d.attributes.set(j.arrowhead,Mg(h)),d)}};const t_=ti(`dot.rank`);var n_=class extends Qg{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(jg(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=T(e.children,k(e=>!this.compoundIds.has(e)),C(e=>this.computedNode(e)),k(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;Kt(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[j.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[j.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(j.newrank,!0),e.set(j.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[j.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,t_.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>gt(e)),[s,c,l]=this.edgeEndpoint(r,Wt),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[j.likec4_id]:e.id,[j.style]:e.line??Jg});l&&f.attributes.set(j.lhead,l),o&&f.attributes.set(j.ltail,o);let p=bt(l)||bt(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(j.weight,d.weight);let m=Kg(e);if(m&&f.attributes.set(p?j.xlabel:j.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[j.color]:t.line,[j.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[j.arrowtail]:Mg(h),[j.dir]:`back`}),g!==`none`&&f.attributes.apply({[j.arrowhead]:Mg(g),[j.dir]:`both`,[j.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[j.arrowtail]:`none`,[j.arrowhead]:`none`,[j.dir]:`none`,[j.minlen]:0,[j.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[j.arrowhead]:Mg(h),[j.arrowtail]:Mg(g),[j.dir]:`both`}),f;if(f.attributes.set(j.arrowhead,Mg(h)),g!==`none`&&f.attributes.set(j.arrowtail,Mg(g)),this.view.edges.length===1)return f;let ee;return ee=u===null&&i.parent==null&&s.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return jg(n)||jg(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(j.minlen,0),f}};function r_(e){let[t,n,r,i]=e?e.split(`,`).map(e=>Ng(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function i_(e){try{let[t,n]=e.split(`,`);return{x:Ng(parseFloat(t)),y:Ng(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function a_(e){let{x:t,y:n}=i_(e.pos),r=Pg(parseFloat(e.width)),i=Pg(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function o_(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=Ng(c.size);continue}if(c.op===`T`){let e=Ng(c.pt[0])-t,l=Ng(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=Ng(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return ei.warn(`Failed on parsing label draw ops:
520
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function s_({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(O(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&ei.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>Ng(e));return P(O(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function c_(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=o_(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Bg(a,{maxchars:40,maxLines:5}).join(`
521
- `):null,{id:t,source:n,target:r,label:a,...D(o)&&{description:o},points:s_(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function l_(e,t){let n=r_(e.bb),{nodes:r,edges:i,hasManualLayout:a,manualLayout:o,...s}=t,c=[],l=[],u;if(u=s._type===`dynamic`?{...s,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[La]:`layouted`,bounds:n,nodes:c,edges:l}:{...s,[La]:`layouted`,bounds:n,nodes:c,edges:l},a){let e=u;e[za]=`auto`}let d=e.objects??[];for(let e of r){let t=d.find(t=>t.likec4_id===e.id);P(t,`View ${s.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?r_(t.bb):a_(t),o=[n,r];c.push({...e,x:n,y:r,width:i,height:a,labelBBox:o_(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let f=e.edges??[];for(let e of i){let t=f.find(t=>t.likec4_id===e.id);if(!t){ei.warn`View ${s.id} edge ${e.id} not found in graphviz output, skipping`;continue}l.push(c_(t,e,s.id))}return u}function u_(e,t){return l_(e,t)}var d_=class e extends Qg{static toDot(t){return new e(t).print()}constructor(e){super(e,No.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[j.nodesep]:Y(100),[j.ranksep]:Y(100)}),e.delete(j.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[j.likec4_id]:e.id,[j.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=N(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=N(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[j.likec4_id]:e.id,[j.likec4_project]:e.projectId,[j.style]:e.line??Jg});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(j.weight,i.weight);let o=Kg(e);if(o&&a.attributes.set(j.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[j.color]:t.line,[j.fontcolor]:t.label})}return a}};const f_=wr(1),p_=ei.getChild(`graphviz-wasm`);var m_=class e{static _graphviz=null;static opsCount=0;get concurrency(){return 1}dispose(){Br.unload(),e._graphviz=null}[Symbol.dispose](){this.dispose()}graphviz(){return Promise.resolve().then(async()=>(e._graphviz||=(p_.debug`loading wasm`,e.opsCount=0,Br.load()),await e._graphviz))}async attempt(t,n,r){return await f_(async()=>{try{let t=await r();return++e.opsCount>=10&&(p_.debug`unloading wasm`,Br.unload(),e._graphviz=null),t}catch(r){p_.error(`FAILED GraphvizWasm. ${t}`,{error:r}),p_.error(`FAILED DOT:
522
- `+n),Br.unload(),e._graphviz=null}p_.warn(`Retrying...`),await fa(10,500);try{return await r()}finally{Br.unload(),e._graphviz=null}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await this.graphviz()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await this.graphviz()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await this.graphviz()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await this.graphviz()).layout(e,`svg`))}};const h_=({view:e,styles:t})=>{switch(!0){case vo(e):return new e_(e,t);case _o(e):return new $g(e,t);case ho(e):return new n_(e,t);default:F(e)}},g_=ei.getChild([`layouter`]);var __=class{graphviz;constructor(e){this.graphviz=e??new m_}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e}async dotToJson(e){let t;try{t=await this.graphviz.layoutJson(e)}catch(t){throw g_.error(M(t)),g_.error`Failed to convert DOT to JSON:\n${e}`,t}try{return JSON.parse(t)}catch(n){throw g_.error(M(n)),g_.error`Failed to parse JSON:\n${t}\n. Generated from DOT:\n${e}`,n}}async layout(e){try{g_.debug`layouting view ${e.view.id}...`;let t=await this.dot(e),{view:n}=e,r=l_(await this.dotToJson(t),n);return n.manualLayout&&(r=yg(r,n.manualLayout)),vo(r)&&Object.assign(r,{sequenceLayout:kg(r)}),t=t.split(`
523
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Zg}`))).join(`
524
- `),g_.debug`layouting view ${e.view.id} done`,{dot:t,diagram:r}}catch(t){throw Error(`Error during layout: ${e.view.id}`,{cause:t})}}async svg(e){let t=await this.dot(e);return t=t.split(`
525
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Zg}`))).join(`
526
- `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=h_(e).print();if(!ho(e.view))return t;try{return await this.graphviz.unflatten(t)}catch(n){return g_.warn(`Error during unflatten: ${e.view.id}`,{error:n}),t}}async layoutProjectsView(e){g_.debug`layouting projects overview...`;let t=new d_(e).print();try{t=await this.graphviz.unflatten(t)}catch(e){g_.warn(`Error during unflatten of projects view`,{error:e})}let n=await this.dotToJson(t);return g_.debug`layouting projects overview done`,u_(n,e)}};const v_=ei.getChild([`layouter`,`queue`]);var y_=class extends __{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Jn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){return this.isProcessingBatch?(v_.debug`waiting for batch to finish`,await this.queue.onIdle(),await pa(),await this.runInQueue(e)):(this.queue.size>this.queue.concurrency*2+1&&(v_.debug`task limit reached: ${this.queue.size} (pending: ${this.queue.pending}), waiting queue to shrink to ${this.queue.concurrency}`,await this.queue.onSizeLessThan(this.queue.concurrency+1)),v_.debug`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,v_.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){v_.debug`adding layoutProjectsView task to queue`;let t=await this.runInQueue(async()=>(v_.debug`layouting projects view`,await super.layoutProjectsView(e)));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){if(this.isProcessingBatch)return v_.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await pa(),await this.batchLayout(e);if(e.cancelToken?.isCancellationRequested)return v_.debug`cancellation requested`,[];let t=this.queue.concurrency;v_.debug`starting batch layout, size: ${e.batch.length}, concurrency: ${t}`,this.isProcessingBatch=!0;let n=[];try{for(let r of e.batch)if(v_.debug`add task for view ${r.view.id}`,this.queue.add(async()=>(t<=2&&await pa(),await super.layout(r))).then(t=>{if(!t){e.onError?.(r,Error(`Layout queue returned null for view ${r.view.id}`));return}n.push(t),e.onSuccess?.(r,t)}).catch(t=>{v_.error(`Fail layout view ${r.view.id}`,{err:t}),e.onError?.(r,t)}),this.queue.size>t+2&&(v_.debug`task limit reached: ${this.queue.size}, waiting queue to shrink to ${t}`,await this.queue.onSizeLessThan(t+1)),e.cancelToken?.isCancellationRequested){v_.debug`cancellation requested`;break}}finally{await this.queue.onIdle(),v_.debug`batch layout done`,this.isProcessingBatch=!1}return n}dispose(){this.queue.clear(),super.dispose()}},b_=class{parser;locator;constructor(e){this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){try{if(yl(e)){let t=te(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id];return n.title!==e.name&&r.push(` `,`**${n.title}**`),r.join(`
527
- `)}if(hl(e)){let t=te(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=V.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id,`_instance of_ ${i}`];return a&&o.push(` `,`**${a.title}**`),o.join(`
528
- `)}if(Ql(e)){let t=te(e),n=this.parser.forDocument(t).parseElement(e);return n?[n.id,` `,`**${n.title}**`].join(`
529
- `):void 0}}catch(e){G(e)}}};function x_(e,t){return[e,t]=S_(e,t)>0?[t,e]:[e,t],C_(e.range,t.range.start)}function S_(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function C_(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function w_(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:We.newLine({allowMore:!0}),oneSpace:We.oneSpace(),noSpace:We.noSpace(),indent:We.indent({allowMore:!0}),noIndent:We.noIndent()};var T_=class extends Re{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Yf,(e,t)=>{let n=ue(e.$cstNode,`values`).filter(D).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,Tl,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...k([e.target,e.tags],D)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,xu,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>tf(e)||Tl(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...k([e.target,e.tags],D)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,tc,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(Ip(e)&&w_(e.$cstNode)||Rp(e)&&Ip(e.$container)&&w_(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&w_(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){yd(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(xd(e)||Rf(e)||Af(e)||Pf(e)||Of(e)||Ku(e)||Ju(e)||Xu(e)||Wu(e)||Hu(e)||Xu(e)||Fd(e)||eu(e)||Du(e)||rf(e)||vf(e)||Nd(e)||zd(e)||gu(e)||Vl(e)||jl(e)||fp(e)||op(e)||dl(e)||pl(e)||uu(e)||Yl(e)||Ld(e)||xl(e)||Dl(e)||_l(e)||Cu(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=w_(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!x_(o,e))&&t.cst([e]).prepend(We.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(We.newLine({allowMore:!0})):i.prepend(We.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,nu)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,mu,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,zl)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,kl)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(cu(e)||gf(e)||mp(e)||Gd(e)||qd(e)||Mf(e)||If(e)||cl(e)||Cd(e)||il(e)||ad(e)||Sf(e)||ol(e)||Yd(e)||Vd(e)||td(e)||sd(e)||rd(e)||wf(e)||$d(e)||Zf(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,Td,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,Ud)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,ep,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,jd,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Ql,(e,t)=>{let n=ae(e.$cstNode,`kind`),r=ae(e.$cstNode,`name`);r&&n&&(S_(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,Tu,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,Ju,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Xu,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,Wu,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,Hu,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,dd,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,ld,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((Af(e)||Pf(e)||Bf(e)||Of(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),Ef(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(Iu(e)||cf(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,yl,(e,t)=>{let n=ae(e.$cstNode,`kind`),r=ae(e.$cstNode,`name`);r&&n&&(S_(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,hl,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,ip,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(np(e)||Gl(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,op,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,fp)?.keyword(`style`).append(X.oneSpace),this.on(e,Fl)?.keyword(`style`).append(X.oneSpace),this.on(e,yu)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,Mu)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(of(e)||Pu(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,$c,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,Ep,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Zc(e)||Mp(e)||wp(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Kc,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,bp,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Wc(e)||Sp(e)||vp(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if($s(e)||cp(e)||Nl(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!w_(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(yu(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&w_(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,pd,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,hd,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Zd,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,Ll,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||$s(t)||cp(t)||Nl(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,Pc)?.property(`value`),t??=this.on(e,Ql)?.properties(`props`),t??=this.on(e,dd)?.properties(`project`),t??=this.on(e,tf)?.properties(`title`,`technology`),t??=this.on(e,op)?.properties(`title`),t??=this.on(e,tc)?.properties(`title`),t??=this.on(e,yl)?.properties(`title`),t??=this.on(e,hl)?.properties(`title`),t??=this.on(e,Tl)?.properties(`title`,`technology`),t??=this.on(e,Td)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function E_(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function D_(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=E_(t,e),a=E_(r,e),o=i.length>0&&a.length>0?gt(Pi(Gt(i),Gt(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var O_=Sn(),k_=t(Cn(),1);function A_(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function j_(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function M_(e){let t=A_([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new Cr({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=Bt(T(n,C(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,k_.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&T(E_(o,e.nodes),ln(e=>e.inEdges.includes(t.id)),It(e=>{i.mergeNode(e.id),(0,k_.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,k_.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,k_.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,k_.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,O_.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:j_(A_(u)),edges:s}}function N_(e){return e.hash=xa({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:T(e.nodes,C(e=>({id:e.id,icon:D(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:Va(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),At(({id:e,...t})=>[e,t])),edges:T(e.edges,C(e=>({source:e.source,target:e.target,label:e.label,description:Va(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),At(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var P_=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},F_=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(ea(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(Mt(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),ea(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=z(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=_a(t,e.elements),t=T(t,ta(t=>e.explicits.has(t)&&!ca(e.final,Hi(t))),la()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=z(e.explicits,t),e.final=z(e.final,t)),e}removeElements(e){return e.elements=z(e.elements,this.excluded.elements),e.explicits=z(e.explicits,this.excluded.elements),e.final=z(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=z(n,e.explicits),e.final=z(e.final,n),e)}precommit(e){return e}postcommit(e){return P(z(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(z(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Vm(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},I_=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return Um([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(ea(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(ea(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(ea(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=Bt(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(Um([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=ga(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=_a(e.elements,ga(e.explicits,this.explicits)),e.final=_a(e.elements,ga(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function L_(e,t=`final`){let n=Zi(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new Dn.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new Dn.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(Nm.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var R_=class extends F_{};function z_(e){if(U.isCustom(e))return z_(e.custom.expr);if(U.isWhere(e)){let t=z_(e.where.expr),n=uo(e.where.condition);return e=>t(e)&&n(e)}if(U.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(U.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(U.isWildcard(e))return()=>!0;if(U.isModelRef(e)){let t=V.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||Ri(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function B_(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!A(o);T(n,k(_t(Wa)),k(t),It(t=>{t.shape=r??t.shape,t.color=i??t.color,mt(a)&&(t.icon=a),mt(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function V_(e,t){for(let n of e)!mo(n)||n.targets.length===0||B_(n,on(n.targets.map(z_)),t);return t}var H_=class e{static kind=Ua;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},U_=class extends F_{excludeRelations(e){return T(this.memory.connections,k(t=>ba(t.relations,e)),It(t=>{this.excludeConnections(t.update(_a(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=z(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=z(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},W_=class extends U_{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:G_,findConnectionsBetween:K_}=eh;var q_=class extends I_{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ea(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(G_(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(K_(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(K_(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(K_(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return to.isRelationExpr(this.expression)||T(e,It(({source:e,target:t,boundary:n})=>{T(dn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),zt(([e,t])=>e===t),Vt(1),It(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},J_=class extends q_{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},Y_=class e extends P_{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new q_(this,e)}stageExclude(e){return new U_(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},X_=class e extends Y_{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=Tn.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new H_(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new H_(r,n,null));let a=Tn.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new J_(this,e)}stageExclude(e){return new W_(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new Y_(t,this.scope)}};function Z_(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function Q_(e){let{id:t,title:n,...r}=ht(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return B({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:ja(e.$element),tags:[...e.tags],...r})}function $_({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:Ua,title:a.title??``,color:a.color??e.group?.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:B({border:a.border??e.group?.border??e.border,opacity:a.opacity??e.group?.opacity??e.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(Ji).forEach(({id:e,...t})=>{let n=Ri(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=Ri(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,Z_(o,r)),o.children.push(e),a=o.level+1);let c=B({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function ev(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...vn(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function tv(e,t){let n=T(e,an((e,t)=>(D(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),D(t.description)&&!e.description.some(vt(t.description))&&e.description.push(t.description),D(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),D(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),D(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),D(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),D(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),D(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),D(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=_n(n.title)??(n.title.length>1?`[...]`:void 0),i=Rt(n.tags),a=B({title:r,description:_n(n.description),technology:_n(n.technology),kind:_n(n.kind),head:_n(n.head),tail:_n(n.tail),color:_n(n.color),line:_n(n.line),navigateTo:_n(n.navigateTo),...Ii(i)&&{tags:i}});if(t){let e=ev(t);a=hn({...a,...e},D)}return w(a.title)&&D(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:nv,findConnectionsBetween:rv,findConnectionsWithin:iv}=Xm;function av(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function ov(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function sv(e){if(H.isWildcard(e))return()=>!0;if(H.isElementTagExpr(e)||H.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(H.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>Ri(e.id)===t:e=>e.id===t}if(H.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?Ri(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function cv(e){return ja(e.$instance)??ja(e.element.$element)}function lv(e){let t=e.id,n=e.onlyOneInstance();return B({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:O(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:ja(e.$node)??void 0,tags:[...e.tags],style:ht(e.style,[`icon`,`shape`,`color`])})}function uv(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return B({id:e.id,kind:`instance`,title:e.title,description:cv(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:O(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function dv(e){return e.isInstance()?uv(e):lv(e)}function fv(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(O(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=tv(n.map(e=>e.$relationship)),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function pv(e,t){let n=$_(e.$styles,[...t.final].map(dv));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=cv(r)??null,t.technology??=r.technology,A(t.tags)&&(t.tags=[...r.tags]),(!t.links||A(t.links))&&O(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function mv(e,t){for(let n of e)!mo(n)||n.targets.length===0||B_(n,on(n.targets.map(sv)),t);return t}function hv(e){let t=new Dn.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new Dn.default(()=>new Set);for(let[e,r]of t)O(r,2)&&T(r,Dt(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),sn(E(`group`)),cn(),k(O(2)),It(Lt(C(E(`conn`)),zm(`desc`),zt((e,t,n)=>t===0||e.boundary===n[t-1].boundary),It(t=>{n.get(t).add(e)}))));return n}function gv(e){e=Um(e);let t=hv(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=_a(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=ga(_a(n.relations.model,e.internalModelRelationships()),_a(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return T(t.entries(),sa(([e,t])=>e.update({model:t,deployment:null})),L())}function _v(e){return Wm(e,gv(e))}function vv(e){return T(e,Um,an((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=xm.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=nv(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)Im(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new Fm(r,i,o)),t},[]))}function yv(e){return Wm(e,vv(e))}var bv=class extends I_{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ea(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(nv(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(rv(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(rv(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(rv(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=T(e,_v,yv);return T(t,It(({source:e,target:t,boundary:n})=>{T(dn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),zt(([e,t])=>e===t),Vt(1),It(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},xv=class e extends P_{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new bv(this,e)}stageExclude(e){return new R_(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&vt(this.state,t.state)}diff(e){return{added:{elements:L(z(e.elements,this.elements)),explicits:L(z(e.explicits,this.explicits)),final:L(z(e.final,this.final)),connections:L(Wm(e.connections,this.connections))},removed:{elements:L(z(this.elements,e.elements)),explicits:L(z(this.explicits,e.explicits)),final:L(z(this.final,e.final)),connections:Wm(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
530
- `)}[Pm](e,t,n){return this.toString()}};const Sv={include:({expr:e,model:t,memory:n,stage:r})=>{let i=uo(e.where.condition);return Pv(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=uo(e.where.condition);return Pv(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Cv={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=Lv(rv(e,[...Hv(e)],`directed`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=av(t,e.incoming);for(let e of a){let t=Lv(rv(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.incoming)||H.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.incoming))return Fv(Tv(t,e.incoming),{stage:r,memory:n},i);if(H.isWildcard(e.incoming))return r;let a=wv(av(t,e.incoming)),o=T(n.connections,k(a),Lv(i));return r.excludeConnections(o),r}};function wv(e){return on(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function Tv(e,t){let n=ov(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const Ev={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of Hv(e)){let n=Lv(nv(t,e,`directed`),i);r.addConnections(n)}return r}P(H.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=av(t,e.outgoing);for(let e of o){let t=Lv(rv(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.outgoing)||H.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.outgoing))return Fv(Ov(t,e.outgoing),{stage:r,memory:n},i);if(H.isWildcard(e.outgoing))return r;let a=Dv(av(t,e.outgoing)),o=T(n.connections,k(a),Lv(i));return r.excludeConnections(o),r}};function Dv(e){return on(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function Ov(e,t){let n=ov(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const kv={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(H.isElementTagExpr(e)||H.isElementKindExpr(e)||H.isElementTagExpr(t)||H.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!H.isModelRef(e),`Invalid source model ref in direct relation`),P(!H.isModelRef(t),`Invalid target model ref in direct relation`);let o=H.isWildcard(e),s=H.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=T(iv(r.instances()),Lv(a),C(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=av(r,e),i=Dv(t),o=i;if(n){let e=wv(t);o=t=>i(t)!==e(t)}l=T(t,Dt(e=>rv(e,Hv(e),c)),k(o),Lv(a));break}case o&&!s:{let e=av(r,t),i=wv(e),o=i;if(n){let t=Dv(e);o=e=>t(e)!==i(e)}l=T(e,Dt(e=>[...Hv(e)].flatMap(t=>nv(t,e,c))),k(o),Lv(a));break}default:{P(!o,`Inferrence failed - source should be a deployment ref`),P(!s,`Inferrence failed - target should be a deployment ref`);let n=av(r,e),i=av(r,t),u=Dv(n),d=wv(i);l=T(n,Dt(e=>rv(e,i,c)),k(e=>u(e)&&d(e)),Lv(a))}}return i.addConnections(l),H.isDeploymentRef(e)&&bt(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),H.isDeploymentRef(t)&&bt(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=sv(e.target),o=sv(e.source),s;switch(!0){case H.isWildcard(e.source)&&H.isWildcard(e.target):return r.excludeConnections(Lv(n.connections,i)),r;case H.isModelRef(e.source)&&H.isModelRef(e.target):return s=Av({source:e.source,target:e.target,expr:e,model:t}),Fv(s,{stage:r,memory:n},i);case H.isModelRef(e.source)&&H.isWildcard(e.target):return s=Ov(t,e.source),Fv(s,{stage:r,memory:n},i);case H.isModelRef(e.source):return s=Ov(t,e.source),Fv(s,{stage:r,memory:n},i,e=>a(e.target));case H.isModelRef(e.target):return s=Tv(t,e.target),Fv(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=T(n.connections,k(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),Lv(i));return c.length===0||r.excludeConnections(c),r}}};function Av({source:e,target:t,expr:n,model:r}){let i=ov(r,e),a=ov(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...nh(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const jv={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.inout)){for(let e of a){let t=zv(rv(e,[...Hv(e)],`both`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=av(t,e.inout);for(let e of a){let t=zv(rv(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.inout)||H.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.inout)){let a=ov(t,e.inout);return a.length===0?r:Fv(ga(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(H.isWildcard(e.inout))return r;let a=av(t,e.inout),o=wv(a),s=Dv(a),c=T(n.connections,k(e=>o(e)!==s(e)),Lv(i));return r.excludeConnections(c),r}},Mv={include:({expr:e,model:t,memory:n,stage:r})=>{let i=uo(e.where.condition);return Pv(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=uo(e.where.condition);return Pv(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Nv={include:({model:e,stage:t,where:n})=>{let r=[],i=T([...e.roots()],Rv(n),C(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(iv([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=T([...t.elements],Rv(n));return e.exclude(r),e}};function Pv(e,{expr:t,where:n,...r}){switch(!0){case H.isElementTagExpr(t):case H.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case Qa.isCustom(t):case H.isCustom(t):case H.isModelRef(t):return;case H.isWhere(t):return Sv[e]({...r,expr:t,where:n});case Qa.isWhere(t):return Mv[e]({...r,expr:t,where:n});case H.isDeploymentRef(t):return Uv[e]({...r,expr:t,where:n});case H.isWildcard(t):return Nv[e]({...r,expr:t,where:n});case Qa.isDirect(t):return kv[e]({...r,expr:t,where:n});case Qa.isInOut(t):return jv[e]({...r,expr:t,where:n});case Qa.isOutgoing(t):return Ev[e]({...r,expr:t,where:n});case Qa.isIncoming(t):return Cv[e]({...r,expr:t,where:n});default:F(t)}}function Fv(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=T(n.connections,k(e=>i(e)),k(t=>ba(t.relations.model,e)),C(t=>t.update({deployment:null,model:_a(t.relations.model,e)})),Lv(r),k(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function Iv(e,t){return Lv(e,t).nonEmpty()}function Lv(...e){if(e.length===1)return t=>Lv(t,e[0]);let[t,n]=e;return n===null?t:yt(t)?t.map(e=>Lv(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(Vv(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(Vv(t)(e))))})}function Rv(...e){if(e.length===1)return t=>Rv(t,e[0]);let[t,n]=e;return yt(t)?t.filter(e=>Rv(e,n)):n?.(Bv(t,t))??!0}function zv(e,t){return t?T(e,k(e=>Iv(e,t))):e}function Bv(e,t){if(ch(e)){let n=oh(t)&&ah(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]]}}if(sh(e))return vn(e.element,[`tags`,`kind`]);if(ah(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags]};if(ih(e))return vn(e,[`tags`,`kind`]);F(e)}function Vv(e){return t=>({tags:t.tags,kind:t.kind,source:Bv(t.source,e.source),target:Bv(t.target,e.target)})}function Hv(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const Uv={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(ah(r))return Rv(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:Gv(r,e);break;case t.selector===`children`:Wv(r,e);break;case t.selector===`descendants`:Kv(r,e);break;default:Rv(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=sv(e),a=T([...n.elements],k(i),Rv(r));return t.exclude(a),t}};function Wv(e,{stage:t,where:n}){let r=Rv([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(iv(r)),t.connectWithExisting(r),t.addExplicit(r))}function Gv(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=Rv([...e.children()],r),a=!1;for(let e of i)if(rv(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(iv(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function Kv(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),Rv(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(iv(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=qv(t);T(i,k(e=>a.has(e)),It(e=>t.addExplicit(e)))}function qv(e){return T(e.mergedConnections(),_v,yv,an((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Jv=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=T(e.connections,_v,yv),n=Wm(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=ga(this.memory.elements,e.elements),n=ga(e.final,this.memory.explicits),r=new Dn.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return T(z(t,i),ta(e=>e.isDeploymentNode()),L(),Yi,It(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&ca(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=L_(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=_n([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=_n(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function Yv(e,t){let n=xv.empty();for(let r of t)if(po(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=Pv(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return Jv.for(n).commit()}function Xv(e,{docUri:t,rules:n,...r}){let i=Yv(e.deployment,n),a=pv(e,i),o=fv(i.connections);D_(a,o);let s=M_({nodes:a,edges:o}),c=mv(n,s.nodes),l=fn(n,So),u=vs(c);return N_({...r,[La]:`computed`,[Ra]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:C(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function Zv(e){return t=>Eo(t)?t.groupRules.flatMap(Zv(e)):po(t)&&`include`in t?t.include.filter(e):[]}function Qv(e,t){let n=e.flatMap(Zv(U.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,description:f,...p}=kt(t,w),m=B({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),h=!A(m),g=!A(p),ee=z_(e);r.forEach((e,t)=>{Wa(e)||!ee(e)||(g&&(e={...e,isCustomized:!0,...p}),f!==void 0&&(e={...e,isCustomized:!0,description:f}),h&&(e={...e,isCustomized:!0,style:{...e.style,...m}}),r[t]=e)})}return r}function $v(e,t){return e.reduce((e,n)=>{if(bo(n)){let r=t.predicates[n.predicateId];return w(r)?e:e.concat(r)}if(yo(n)){let r=t.styles[n.styleId];return w(r)?e:e.concat(r)}return e.push(n),e},[])}function ey(e,t){return e.reduce((e,n)=>{if(bo(n)){let r=t.dynamicPredicates[n.predicateId];return w(r)?e:e.concat(r)}if(yo(n)){let r=t.styles[n.styleId];return w(r)?e:e.concat(r)}return e.push(n),e},[])}function ty(e,t){let n=new Set;for(let r of t)if(po(r))for(let t of r.include){let r=z_(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const ny=e=>{if(wo(e)){let t=[],n=[];for(let r of e.__parallel)if(To(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return To(e)?[...e.__series]:e};function ry(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of Dt(t,ny)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function iy(e,t,n){let r=th(e,t,`directed`).flatMap(e=>[...e.relations]).sort(ha);if(!Ii(r))return{};if(r.length===1){let e=r[0];return B({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=T(r,Dt(e=>e.tags),Rt()),a=O(i,1)?i:void 0,o=C(r,e=>e.id),s=Wt(r).$relationship.navigateTo;s===n&&(s=void 0),s||=T(r,Dt(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),Rt(),_n());let c=T(r,an((e,{title:t,technology:n,$relationship:r})=>(D(t)&&e.title.add(t),D(r.color)&&e.color.add(r.color),D(r.line)&&e.line.add(r.line),D(r.kind)&&e.kind.add(r.kind),D(n)&&e.technology.add(n),D(r.description)&&!e.description.some(vt(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return B({tags:a??void 0,relations:o,navigateTo:s,kind:_n([...c.kind]),title:_n([...c.title]),color:_n([...c.color]),line:_n([...c.line]),technology:_n([...c.technology]),description:_n(c.description)})}var ay=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=ey(t,this.model.globals),a=ty(this.model,i),o=ry(this.model,n),s=T(ga(_a(a,o),o,a),L(),Zi),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(To(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?Ya(n,t):Ya(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),ee=s.indexOf(g);P(ee>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:te,relations:ne,navigateTo:re,...ie}=iy(m,g,this.view.id),ae=D(d)&&d!==this.view.id?d:re,oe=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(B({...ie,...p,...oe&&{technology:oe},id:r,source:m,target:g,navigateTo:ae,title:o??te,relations:ne??[],isBackward:h>ee})),t+1},u=1;for(let e of n){if(wo(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=$_(this.model.$styles,s.map(Q_)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:Gi(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=Ri(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of Ki(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of Ki(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=Qv(i,V_(i,s.map(e=>N(d.get(e.id))))),h=fn(i,So),g=vs(m);return N_({...r,[Ra]:`dynamic`,[La]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:C(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function oy(e,t){return new ay(e,t).compute()}function sy(e){switch(!0){case eo.isCustom(e):return sy(e.customRelation.expr);case eo.isWhere(e):{let t=sy(e.where.expr),n=uo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind},target:{tags:e.target.tags,kind:e.target.kind},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind}})}case eo.isDirect(e):{let t=z_(e.source),n=z_(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case eo.isInOut(e):{let t=z_(e.inout);return e=>t(e.source)||t(e.target)}case eo.isIncoming(e):{let t=z_(e.incoming);return e=>t(e.target)}case eo.isOutgoing(e):{let t=z_(e.outgoing);return e=>t(e.source)}default:F(e)}}function cy(e,t,n){let r=e.flatMap(Zv(eo.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:{txt:a}}:{},c=o?{notes:{txt:o}}:{},l=kt(s,w),u=sy(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...vn(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function ly(e){return T([...e],Um,an((e,t,n,r)=>{let i=Hm(r,t),a=ga(...i.map(E(`relations`))),o=_a(t.relations,a);if(i.length>0&&(o=ga(o,t.directRelations)),Lm(r,t.reversed())&&(o=ga(o,t.directRelations)),o.size<t.relations.size){let e=r.some(Jm(t.source)),n=r.some(Jm(t.target));e&&(o=ga(o,la(ta(t.relations,Km(t.source))))),n&&(o=ga(o,la(ta(t.relations,qm(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var uy=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=ly(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=ga(this.memory.elements,e.elements),n=ga(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return T(z(t,r),L(),Yi,It(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&ca(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=L_(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=_n([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=_n(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:dy,findConnectionsBetween:fy,findConnectionsWithin:py}=eh;function my(e,t){switch(!0){case U.isElementKindExpr(t):return[...ta(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case U.isElementTagExpr(t):return[...ta(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(V.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(V.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case U.isModelRef(t):return[e.element(V.flatten(t.ref))];default:F(t)}}function hy(e,t){if(t.isEmpty()||e.length===0)return e;let n=on(e.map(e=>Hi(e))),r=L(ta(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function gy(e,{memory:t,model:n}){let r=my(n,e);return U.isModelRef(e)?e.selector===`descendants`?r:hy(r,t):r}const _y={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(V.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(py(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(my(t,e));return n.exclude(i),n}},vy={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(my(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(py(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(my(t,e));return n.exclude(i),n}},yy={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(my(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(py(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(my(t,e));return n.exclude(i),n}},by=()=>!0,xy=e=>e;function Sy(e){return e.reduce((e,t)=>{let n=[...t.relations];P(O(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=tv(n.map(e=>e.$relationship),_n(k(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function Cy(e,t){return $_(e.$styles,[...t.final].map(Q_),t.groups)}const wy=U.isWildcard,Ty=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Ey={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=wy(e),l=wy(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==by:{let e=T(i.relationships(),ta(o),L(),C(e=>new Ym(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==by:u.push(...py(r.elements));break;case c&&l:u.push(...py(i.roots()));break;case!c&&l&&o!==by:{let t=T(my(i,e),Dt(e=>T(e,tn(Qt(n===!0),{onTrue:e=>ga(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ta(o),ua(),L(),Bt(t=>t.source===e),([t,n])=>mn(T(t,k(t=>!Ty(e,t.target)),C(t=>new Ym(e,t.target,new Set([t])))),T(n,k(t=>!Ty(e,t.source)),C(t=>new Ym(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=Dy(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...fy(e,a,o));break}case c&&!l&&o!==by:{let e=T(my(i,t),Dt(e=>T(e,tn(Qt(n===!0),{onTrue:e=>ga(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ta(o),L(),Bt(t=>t.target===e),([t,n])=>mn(T(n,k(t=>!Ty(e,t.target)),C(t=>new Ym(e,t.target,new Set([t])))),T(t,k(t=>!Ty(e,t.source)),C(t=>new Ym(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=Dy(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...fy(t,e,o));break}default:{P(!wy(e),`Inference failed - source must be not a wildcard`),P(!wy(t),`Inference failed - target must be not a wildcard`);let a=gy(e,{memory:r,model:i}),o=gy(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...fy(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=wy(e),c=wy(t),l;switch(!0){case s&&c:l=T(i.connections,Dt(Lt(E(`relations`),ta(o),L())),la());break;case!s&&c:l=T(my(r,e),Dt(e=>T(e,tn(Qt(n===!0),{onTrue:e=>ga(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ta(o),L())),la());break;case s&&!c:l=T(my(r,t),Dt(e=>T(e,tn(Qt(n===!0),{onTrue:e=>ga(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ta(o),L())),la());break;default:{P(!wy(e),`Inferrence failed - source must be not a wildcard`),P(!wy(t),`Inferrence failed - target must be not a wildcard`);let i=my(r,e),a=my(r,t),s=new Set;for(let e of i)for(let t of a)Vi(e,t)||(s=ga(s,_a(e.allOutgoing,t.allIncoming),n?_a(t.allOutgoing,e.allIncoming):new Set));l=la(ta(s,o))}}return a.excludeRelations(l),a}};function Dy(e,{memory:t,model:n}){let r=my(n,e);if(!O(r,1))return[[],[]];if(U.isModelRef(e)){let i=L(n.element(V.flatten(e.ref)).ascendingSiblings());return[hy(r,t),hy(i,t)]}return[r,T(r,C(e=>e.ascendingSiblings()),ra(),ua(),L(),e=>hy(e,t))]}const Oy={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(U.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...dy(e,t,`directed`))}else{let e=gy(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Rt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=ky(n,o);for(let n of t)s.push(...fy(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=my(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function ky(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=z_(t);return t=>e(t.target)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return on([...e.children(n)].map(e=>Nm.isIncoming(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return on([Nm.isInside(n),...[...e.children(n)].map(e=>Nm.isIncoming(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return on([Nm.isIncoming(e),Nm.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return Nm.isIncoming(e)}default:F(t)}}const Ay={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(U.isWildcard(e)){if(!t)return;o.push(...fy(t,t.ascendingSiblings()))}else{let t=gy(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=Rt(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...fy(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=my(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(la(a.filter(i))),r}},jy={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(U.isWildcard(o)){if(!t)return;s.push(...fy(t,t.ascendingSiblings(),`directed`))}else{let e=gy(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Rt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=My(n,o);for(let n of e)s.push(...fy(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=my(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(la(a.filter(i))),r}};function My(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=z_(t);return t=>e(t.source)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return on([...e.children(n)].map(e=>Nm.isOutgoing(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return on([Nm.isInside(n),...[...e.children(n)].map(e=>Nm.isOutgoing(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return on([Nm.isOutgoing(e),Nm.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return Nm.isOutgoing(e)}default:F(t)}}const Ny={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=Bt(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(py(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(ta(e.children(),i)),s=o.length>0;if(!s)if(a){if(fy(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=la([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(fy(e,o,`directed`));s&&(n.addConnections(py(o)),n.addExplicit(o));for(let e of o)n.addConnections(fy(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===by?e?(n.exclude([e,...e.descendants()]),n):Y_.empty(t.scope).stageExclude(n.expression):(n.exclude(k([...t.elements],r)),n)};function Py(e,t,n){switch(!0){case U.isCustom(e):return t===`include`?Py(e.custom.expr,t,n):n.stage;case U.isWhere(e):{let r=uo(e.where.condition),i=e=>k(e,r);return Py(e.where.expr,t,{...n,where:r,filterWhere:i})}case U.isModelRef(e)&&e.selector===`expanded`:return _y[t]({...n,expr:e})??n.stage;case U.isWildcard(e):return Ny[t]({...n,expr:e})??n.stage;case U.isElementKindExpr(e):case U.isElementTagExpr(e):return vy[t]({...n,expr:e})??n.stage;case U.isModelRef(e):return yy[t]({...n,expr:e})??n.stage;default:F(e)}}function Fy(e,t,n){switch(!0){case eo.isCustom(e):return t===`include`?Fy(e.customRelation.expr,t,n):n.stage;case eo.isWhere(e):{let r=uo(e.where.condition),i=e=>new Set(k([...e],r)),a=e=>T(e,C(e=>new Ym(e.source,e.target,i(e.relations))),k(e=>e.nonEmpty()));return Fy(e.where.expr,t,{...n,where:r,filterWhere:a})}case eo.isInOut(e):return Ay[t]({...n,expr:e})??n.stage;case eo.isDirect(e):return Ey[t]({...n,expr:e})??n.stage;case eo.isOutgoing(e):return jy[t]({...n,expr:e})??n.stage;case eo.isIncoming(e):return Oy[t]({...n,expr:e})??n.stage;default:F(e)}}function Iy(e,t,n){let r={model:e,scope:t.scope,where:by,filterWhere:xy};for(let i of n){if(Eo(i)){t=Iy(e,X_.enter(t,i),i.groupRules),P(t instanceof X_,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(po(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case to.isFqnExpr(i):n=Py(i,e,{...r,stage:n,memory:t})??n;break;case to.isRelationExpr(i):n=Fy(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function Ly(e,t,n){return t=Iy(e,t,n),uy.for(t).commit()}function Ry(e,{docUri:t,rules:n,...r}){let i=$v(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=Ly(e,Y_.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=By(o);let s=Cy(e,o),c=Sy(o.connections);D_(s,c);let l=M_({nodes:s,edges:c}),u=Qv(i,V_(i,l.nodes)),d=fn(i,So),f=vs(u),p=zy(i,u);return N_({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:cy(i,u,l.edges),nodes:C(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function zy(e,t){let n=[];for(let r of e){if(!Do(r)||r.targets.length===0)continue;let e=T(t,k(on(r.targets.map(z_))),C(e=>e.id));O(e,1)&&n.push({type:r.rank,nodes:e})}return n}function By(e){if(e.groups.length===0)return e;let t=new Dn.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(T(Zi([...e.explicitFirstSeenIn.keys()]),It(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),T(Zi([...e.lastSeenIn.keys()]),k(e=>!n.has(e)),It(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function Vy(e,t){switch(!0){case ho(e):return Ry(t,e);case _o(e):return Xv(t,e);case vo(e):return oy(t,e);default:F(e)}}function Hy(e,t){try{return{isSuccess:!0,view:Vy(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function Uy(e){let t=new Cr({type:`directed`}),n=[];for(let r of cn(e))t.addNode(r.id,{view:r}),go(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,k_.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,O_.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!go(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!ho(i))return e;let a=Rt([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:Ii(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const Wy=e=>Et(e).length,Gy=e=>Sa(e);function Ky(e){let t=qy(e),n=(e,t)=>`${e}->${t}`,r=new Dn.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!A(t.$data.imports))for(let[e,n]of Yt(t.$data.imports))for(let r of n){let n=Ka(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(O(i,1),`Relationships set must have at least one relationship`);let a={id:Sa(e),source:Gy(t),target:Gy(n),projectId:t,relations:C(i,E(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:Rt(Dt(i,E(`tags`)))},o=_n(i);return o&&(a.label=o.title,a.description=ja(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});D_(t,o);let s=M_({nodes:t,edges:o});return{id:`projects-view`,[Ra]:`projects`,[La]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function qy(e){let t=new Map;for(let n of e){let e=Ba(n.projectId),r={id:Gy(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${Wy(n.$data.elements)}`,`Relationships: ${Wy(n.$data.relations)}`,`Views: ${Wy(n.$data.views)}`].join(`
531
- `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function Jy(e,t){return{...Ry(e,{id:Ga(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}Xe();const Yy=W.getChild(`LanguageServices`);var Xy=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=T(this.services.shared.workspace.LangiumDocuments.groupedByProject(),Yt(),C(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:C(n,E(`uri`)),config:a}}));if(O(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(O(t,1))return t;let{folderUri:n,config:r}=e.getProject(Hh.DefaultProjectId),i=C(this.services.shared.workspace.LangiumDocuments.projectDocuments(Hh.DefaultProjectId).toArray(),E(`uri`));return[{id:Hh.DefaultProjectId,folder:n,title:r.title??r.name,documents:i,config:r}]}project(e){e=this.projectsManager.ensureProjectId(e);let{folderUri:t,config:n}=this.services.shared.workspace.ProjectsManager.getProject(e),r=C(this.services.shared.workspace.LangiumDocuments.projectDocuments(e).toArray(),E(`uri`));return{id:e,folder:t,title:n.title??n.name,documents:r,config:n}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return Mm.create({...r.$data,_stage:`layouted`,views:T(i,C(E(`diagram`)),jt(E(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Mm.EMPTY){Yy.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!O(n,1))throw Error(`No models found`);let r=Ky(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return this.services.shared.workspace.LangiumDocuments.allExcludingBuiltin.toArray().flatMap(e=>(e.diagnostics??[]).filter(e=>e.severity===ze.Error).map(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}async dispose(){try{Yy.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){Yy.error(M(e))}finally{Yy.debug(`LikeC4LanguageServices disposed`)}}},Zy=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){G(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function Qy(e){try{let t=Hf(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function $y(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function eb(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function tb(e){let t;for(;t=e.value?.ref;){if(yl(t))return null;if(hl(t))return t;if(w(e.parent))return null;e=e.parent}return null}function nb(e){let t=eb(e);return t?.$type===`Imported`?t:null}function rb(e){let t;for(;t=e.value?.ref;){if(qs(t))return!0;if(w(e.parent))return!1;e=e.parent}return!1}function ib(e){if(ld(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(dd(e))}if(dd(e))return e.project;let t=le(e)?te(e):e;return N(t.likec4ProjectId,()=>`Invalid state, document ${t.uri} has no project ID assigned`)}function ab(...e){return Sa(e.length>1?e.join(`:::`):e[0])}function ob(e){try{return e()}catch(e){W.debug(`Safe call failed`,{error:e});return}}function sb(){try{return performance.now()}catch{return Date.now()}}function cb(){let e=sb();return{get ms(){return sb()-e},get pretty(){return Tr(sb()-e)}}}var lb=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(mh(e))return e.state<m.Linked&&(W.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(m.Linked,e.uri,n),W.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=fh.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=ib(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};Xe();const ub=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function db(e,t){return ge(t.feature)&&t.property===`project`&&dd(e.node)}var fb=class extends g{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case _e(t.feature):return this.completionForKeyword(e,t.feature,n);case re(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case db(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:v.Snippet,insertTextFormat:Ge.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&pe(e.node,zd):n(e,{label:t.value,detail:`Insert deployment view`,kind:v.Class,insertTextFormat:Ge.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
532
- `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:v.Property,insertTextFormat:Ge.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Ge.Snippet,insertText:`${t.value} \${1|${Di.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Ge.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
533
- `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
534
- `)});break;case t.value===`dynamic`&&pe(e.node,zd):n(e,{label:t.value,detail:`Insert dynamic view`,kind:v.Class,insertTextFormat:Ge.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
535
- `)});break;case t.value===`style`&&e.node&&pe(e.node,Ju):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${ub}|} $0\n}`});break;case t.value===`style`&&e.node&&pe(e.node,on([zd,Xu])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${ub}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Ge.Snippet,insertText:`${t.value} {\n\t\${1|${ub}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:v.Class,insertTextFormat:Ge.Snippet,insertText:`extend $1 {
1192
+ `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...Xg(this.services.likec4.LanguageServices)),n.registerTool(...u_(this.services.likec4.LanguageServices)),n.registerTool(...l_(this.services.likec4.LanguageServices)),n.registerTool(...c_(this.services.likec4.LanguageServices)),n.registerTool(...p_(this.services.likec4.LanguageServices)),n.registerTool(...h_(this.services.likec4.LanguageServices)),n.registerTool(...Yg(this.services.likec4.LanguageServices)),n.registerTool(...r_(this.services.likec4.LanguageServices)),n.registerTool(...a_(this.services.likec4.LanguageServices)),n.registerTool(...s_(this.services.likec4.LanguageServices)),n.registerTool(...$g(this.services.likec4.LanguageServices)),n.registerTool(...t_(this.services.likec4.LanguageServices)),n.registerTool(...Qh(this.services.likec4.LanguageServices)),n.registerTool(...Jh(this.services.likec4.LanguageServices)),n.registerTool(...e_(this.services.likec4.LanguageServices)),n.registerTool(...Zh(this.services.likec4.LanguageServices)),n.registerTool(...__(this.services.likec4.LanguageServices)),t&&n.registerTool(...Zg(this.services.likec4.LanguageServices)),n.server.onerror=e=>{W.error(ci(e))},n}},y_=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(Wm.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new pr,await this._mcp.connect(this.transport),Wm.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{Wm.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function b_(e){let t=new it;t.use(`*`,ot({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new at({eventStore:new st({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(Wm.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(Wm.error(ci(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function x_(e){let{factory:t,port:n}=e,r=await b_(t);return new Promise((e,t)=>{let i=Er({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var S_=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}Wm.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await x_({factory:this.services.mcp.ServerFactory,port:e}),Wm.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(Wm.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?Wm.error(`Failed to stop MCP server`,{err:e}):Wm.info(`MCP server stopped`),t()})})):(Wm.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function C_(e,t=33335){Wm.debug(`Creating StreamableLikeC4MCPServer`);let n=new S_(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){Wm.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=ci(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),Wm.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function w_(e){return new y_(e)}function T_(e=`sse`){return{mcpServer:t=>e===`stdio`?w_(t):C_(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new v_(e)}}const E_={top:50,right:40,bottom:40,left:40};function D_(e,t){let n=e.nodes.map(e=>{let n=t.nodes[e.id];if(!n)return e;let{x:r,y:i,width:a,height:o}=n;return{...e,width:a,height:o,x:r,y:i}}),r=e.edges.map(e=>{let n=t.edges[e.id];return n?{...e,...n}:e});return{...e,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},nodes:n,edges:r}}function O_(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(e.hash===t.hash||N_(e,t))return j_(e.nodes.filter(e=>!e.parent),n,t),D_(e,t);e.hasLayoutDrift=!0;let r=Qa.merge(...e.nodes.map(e=>t.nodes[e.id]).filter(e=>!!e));return e.nodes.filter(e=>e.parent==null).reduce((e,r)=>k_(r,e,n,t),{x:r.x,y:r.y+r.height+100}),e.edges.filter(e=>!t.edges[e.id]).forEach(e=>A_(e,t)),D_(e,t)}function k_(e,t,n,r){let i=r.nodes[e.id],a=i?.isCompound??!1,o=!i,s=o?t:{x:i.x,y:i.y},c=e.children.map(e=>r.nodes[e]).filter(e=>!!e),l=c.length>0&&Qa.merge(...c),u=a&&l?{x:l.x,y:l.y+l.height+100}:{x:s.x+E_.left,y:s.y+E_.top};return e.children.map(e=>n.get(e)).reduce((e,t)=>k_(t,e,n,r),u),i=e.children.length>0?M_(e,r):r.nodes[e.id]??{isCompound:!1,width:e.width,height:e.height,x:s.x,y:s.y},r.nodes[e.id]=i,o?{x:i.x+i.width+100,y:i.y}:t}function A_(e,t){let n=t.nodes[e.source],r=t.nodes[e.target],i=P_(Qa.center(n)),a=P_(Qa.center(r)),o=a.subtract(i),{x:s,y:c}=o.divide(2).add(i),l={...e?.labelBBox??{width:0,height:0},x:s,y:c},u=o.multiply(.7).add(i),d=o.multiply(.3).add(i);t.edges[e.id]={points:[[i.x,i.y],[d.x,d.y],[u.x,u.y],[a.x,a.y]],labelBBox:l,controlPoints:[u]}}function j_(e,t,n){e.filter(e=>e.children.length>0).forEach(e=>{j_(e.children.map(e=>t.get(e)).filter(e=>!!e),t,n),n.nodes[e.id]=M_(e,n)})}function M_(e,t){let n=Qa.merge(...e.children.map(e=>t.nodes[e]));return{isCompound:!0,x:n.x-E_.left,y:n.y-E_.top,width:n.width+E_.left+E_.right,height:n.height+E_.top+E_.bottom}}function N_(e,t){let n=e=>e.children.length>0;return Dr(e.autoLayout,t.autoLayout)&&e.nodes.every(e=>{let r=t.nodes[e.id];return!!r&&n(e)===r.isCompound})&&e.edges.every(e=>!!t.edges[e.id])}function P_({x:e,y:t}){return new eo(e,t)}function F_(e){return w(e,At(e=>e.parallelPrefix??void 0),zt((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),yn())}function I_(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new Vn.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=Vn.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var L_=class{#e=new Mr;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,kr.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of F_(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,kr.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,kr.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,kr.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Ft(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return x(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,kr.strong).before(i),this.put(s,kr.strong).before(r),this.put(c,kr.strong).after(a.right),this.put(l,kr.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=On(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Or;return this.#e.addEditVariable(t,kr.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,kr.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,kr.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,kr.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,kr.weak);break}}constraint(e,t,n=void 0,r=kr.medium){let i;switch(t){case`==`:i=jr.Eq;break;case`>=`:i=jr.Ge;break;case`<=`:i=jr.Le;break;case`== 0`:i=jr.Eq,n=0;break;case`>= 0`:i=jr.Ge,n=0;break;case`<= 0`:i=jr.Le,n=0;break;default:F(t)}this.#e.addConstraint(new Ar(e,i,n??0,r))}put(e,t=kr.required){let n=t===kr.required?kr.medium:kr.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function R_(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>_o(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(E(i,1),`actors array must not be empty`);let a=new Hn.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=Uo(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new L_({actors:i,steps:o,compounds:I_(i,e.nodes)}),l=c.getViewBounds(),u=w(c.getCompoundBoxes(),x(({node:e,...t})=>({...t,id:e.id,origin:e.id})),vn(`id`),zt((e,t)=>E(e,2)?x(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),yn(),Ct());return{actors:i.map(e=>z_({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:x(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function z_({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var B_=t(Fr(),1);function V_(e){return e.children.length>0}function H_(e){switch(e){case`open`:return`vee`;default:return e}}function U_(e){return Array.isArray(e)?[U_(e[0]),U_(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const W_=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),Y=e=>Math.ceil(e/72*1e3)/1e3,G_=e=>Math.ceil(e);G_(40).toString();function K_(e,t){return Lr(Rr(e,{l:-35-5*t,s:-15-5*t}))}function q_(e){return Lr(Ir(e,.3))}function J_(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Y_(e,{maxchars:t,maxLines:n,sanitize:r=Dt()}){let i=(0,B_.default)(e,{width:t,indent:``,escape:r}).split(`
1193
+ `);return Vt(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function X_({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Y_(e,{maxchars:t,maxLines:r,sanitize:J_}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${G_(n)}"${s}>${o}</FONT>`}function Z_(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Q_(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=b(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[X_({text:e.title,fontsize:r.textSize,maxchars:Z_(n),maxLines:a?1:3})];if(n!==`xs`){b(e.technology?.trim())&&l.push(X_({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Xo.from(e.description).text;t&&l.push(X_({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function $_(e,t){let n=X_({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const ev=`BGCOLOR="${$o.DEFAULT.relationshipColors.labelBg}A0"`;function tv({label:e,technology:t}){let n=[];return b(e?.trim())&&n.push(X_({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),b(t?.trim())&&n.push(X_({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${ev}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function nv(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${ev}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${G_(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return b(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${ev} CELLPADDING="3">`,X_({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const rv=`dashed`,iv=`Arial`,av=xi(`dot`),ov=50.1;var sv=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new zr({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(V_).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=la(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(V_(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(V_(t))S(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return Pr(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=Nr({[M.likec4_viewId]:this.view.id,[M.bgcolor]:`transparent`,[M.layout]:`dot`,[M.compound]:!0,[M.rankdir]:e.direction,[M.TBbalance]:`min`,[M.splines]:`spline`,[M.outputorder]:`nodesfirst`,[M.nodesep]:Y(e.nodeSep??110),[M.ranksep]:Y(e.rankSep??120),[M.pad]:Y(15),[M.fontname]:iv});return t.attributes.graph.apply({[M.fontsize]:G_(this.styles.fontSize()),[M.labeljust]:e.direction===`RL`?`r`:`l`,[M.labelloc]:e.direction===`BT`?`b`:`t`,[M.margin]:ov}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[M.fontname]:iv,[M.shape]:`rect`,[M.fillcolor]:t.fill,[M.fontcolor]:t.hiContrast,[M.color]:t.stroke,[M.style]:`filled`,[M.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[M.arrowsize]:.75,[M.fontname]:iv,[M.fontsize]:G_(14),[M.penwidth]:G_(2),[M.color]:t.line,[M.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=V_(e),n=ia(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=ia(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(V_(e),`node should be compound`),P(It(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=q_(n.loContrast);return t.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.likec4_depth]:e.depth,[M.fillcolor]:K_(n.fill,e.depth),[M.color]:K_(n.stroke,e.depth),[M.style]:`filled`,[M.margin]:G_(e.children.length>1?40:32)}),wt(e.title.trim())||t.set(M.label,$_(e,r)),t}elementToNode(e,t){P(!V_(e),`node should not be compound`);let n=b(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.label]:Q_(e,this.styles),[M.margin]:`${Y(s)},${Y(i)}`}),t.attributes.set(M.width,Y(a)),t.attributes.set(M.height,Y(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[M.fillcolor]:r.fill,[M.fontcolor]:r.hiContrast,[M.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[M.margin]:`${Y(s)},${Y(0)}`,[M.penwidth]:G_(2),[M.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[M.margin]:`${Y(n?s:s+4)},${Y(i+6)}`});break;case`mobile`:t.attributes.apply({[M.margin]:`${Y(n?s:s+4)},${Y(i)}`});break;case`queue`:t.attributes.apply({[M.width]:Y(a),[M.height]:Y(o-8),[M.margin]:`${Y(n?s:s+4)},${Y(i)}`});break;case`component`:t.attributes.apply({[M.width]:Y(a+10),[M.margin]:`${Y(s+20)},${Y(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!V_(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return V_(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(V_(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return w(this.descendants(e),C(e=>Tn(e.inEdges,e.outEdges)),qt(),xn(Tn(t.inEdges,t.outEdges)),x(e=>this.view.edges.find(t=>t.id===e)),D(b))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=w(this.view.nodes,D(V_),x(e=>e.id),Zt(fa),en(),x(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),D(({edges:e})=>e.length>1&&e.length<8),Xt(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(M.group,n.id),i.attributes.set(M.group,n.id)}catch(e){av.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=Y(i.center.x)+n,o=Y(e-i.center.y);i.fixedsize?t.attributes.apply({[M.pos]:`${a},${o}!`,[M.pin]:!0,[M.width]:Y(i.fixedsize.width),[M.height]:Y(i.fixedsize.height),[M.fixedsize]:!0}):t.attributes.set(M.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(M.weight),e.attributes.delete(M.minlen),e.attributes.delete(M.constraint);return this.graphvizModel.apply({[M.layout]:`fdp`,[M.overlap]:`vpsc`,[M.sep]:`+50,50`,[M.esep]:`+10,10`,[M.start]:`random2`,[M.splines]:`compound`,[M.K]:10}),this.graphvizModel.delete(M.compound),this.graphvizModel.delete(M.rankdir),this.graphvizModel.delete(M.nodesep),this.graphvizModel.delete(M.ranksep),this.graphvizModel.delete(M.pack),this.graphvizModel.delete(M.pad),this.graphvizModel.delete(M.packmode),this.graphvizModel.attributes.graph.delete(M.margin),this}},cv=class extends sv{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(M.TBbalance),e.apply({[M.nodesep]:Y(t.nodeSep??130),[M.ranksep]:Y(t.rankSep??130)}),e}postBuild(e){w(this.view.nodes,x(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),At(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),yn(),x(e=>e),Gt(t=>{t.length<2||e.subgraph({[M.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),hn(()=>{e.set(M.newrank,!0),e.set(M.clusterrank,`global`),e.delete(M.pack),e.delete(M.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(M.margin,G_(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Ft(e)),[s,c,l]=this.edgeEndpoint(r,$t),u=Mt(l)||Mt(o),d=t.edge([a,c],{[M.likec4_id]:e.id,[M.style]:e.line??rv});l&&d.attributes.set(M.lhead,l),o&&d.attributes.set(M.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(M.weight,f);let p=tv(e);if(p&&d.attributes.set(u?M.xlabel:M.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[M.arrowhead]:H_(m),[M.arrowtail]:H_(e.tail??m),[M.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(M.constraint,!1),d):(m&&d.attributes.set(M.arrowhead,H_(m)),h!==`none`&&d.attributes.set(M.arrowtail,H_(h)),d)}},lv=class extends sv{postBuild(e){e.delete(M.TBbalance),e.set(M.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Ft(e)),[c,l,u]=this.edgeEndpoint(i,$t),d=t.edge([o,l],{[M.likec4_id]:e.id,[M.style]:e.line??rv});if(u&&d.attributes.set(M.lhead,u),s&&d.attributes.set(M.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(b).join(`
1194
+ `),p=nv(vo(e.id),f);d.attributes.set(M.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[M.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[M.arrowtail]:H_(h),[M.dir]:`back`}),g!==`none`&&d.attributes.apply({[M.arrowhead]:H_(g),[M.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[M.arrowhead]:H_(h),[M.arrowtail]:H_(g),[M.dir]:`both`}),d):h===`none`?(d.attributes.delete(M.arrowhead),d.attributes.apply({[M.arrowtail]:H_(g),[M.minlen]:0,[M.dir]:`back`}),d):(d.attributes.set(M.arrowhead,H_(h)),d)}};const uv=xi(`dot.rank`);var dv=class extends sv{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(V_(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=w(e.children,D(e=>!this.compoundIds.has(e)),x(e=>this.computedNode(e)),D(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;tn(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[M.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[M.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(M.newrank,!0),e.set(M.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[M.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,uv.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Ft(e)),[s,c,l]=this.edgeEndpoint(r,$t),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[M.likec4_id]:e.id,[M.style]:e.line??rv});l&&f.attributes.set(M.lhead,l),o&&f.attributes.set(M.ltail,o);let p=Mt(l)||Mt(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(M.weight,d.weight);let m=tv(e);if(m&&f.attributes.set(p?M.xlabel:M.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[M.arrowtail]:H_(h),[M.dir]:`back`}),g!==`none`&&f.attributes.apply({[M.arrowhead]:H_(g),[M.dir]:`both`,[M.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`,[M.minlen]:0,[M.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[M.arrowhead]:H_(h),[M.arrowtail]:H_(g),[M.dir]:`both`}),f;if(f.attributes.set(M.arrowhead,H_(h)),g!==`none`&&f.attributes.set(M.arrowtail,H_(g)),this.view.edges.length===1)return f;let ee;return ee=u===null&&i.parent==null&&s.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return V_(n)||V_(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(M.minlen,0),f}};function fv(e){let[t,n,r,i]=e?e.split(`,`).map(e=>U_(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function pv(e){try{let[t,n]=e.split(`,`);return{x:U_(parseFloat(t)),y:U_(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function mv(e){let{x:t,y:n}=pv(e.pos),r=W_(parseFloat(e.width)),i=W_(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function hv(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=U_(c.size);continue}if(c.op===`T`){let e=U_(c.pt[0])-t,l=U_(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=U_(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return bi.warn(`Failed on parsing label draw ops:
1195
+ {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function gv({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(E(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&bi.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>U_(e));return P(E(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function _v(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=hv(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Y_(a,{maxchars:40,maxLines:5}).join(`
1196
+ `):null,{id:t,source:n,target:r,label:a,...b(o)&&{description:o},points:gv(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function vv(e,t){let n=fv(e.bb),{nodes:r,edges:i,hasManualLayout:a,manualLayout:o,...s}=t,c=[],l=[],u;if(u=s._type===`dynamic`?{...s,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[no]:`layouted`,bounds:n,nodes:c,edges:l}:{...s,[no]:`layouted`,bounds:n,nodes:c,edges:l},a){let e=u;e[io]=`auto`}let d=e.objects??[];for(let e of r){let t=d.find(t=>t.likec4_id===e.id);P(t,`View ${s.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?fv(t.bb):mv(t),o=[n,r];c.push({...e,x:n,y:r,width:i,height:a,labelBBox:hv(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let f=e.edges??[];for(let e of i){let t=f.find(t=>t.likec4_id===e.id);if(!t){bi.warn`View ${s.id} edge ${e.id} not found in graphviz output, skipping`;continue}l.push(_v(t,e,s.id))}return u}function yv(e,t){return vv(e,t)}var bv=class e extends sv{static toDot(t){return new e(t).print()}constructor(e){super(e,$o.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[M.nodesep]:Y(100),[M.ranksep]:Y(100)}),e.delete(M.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[M.likec4_id]:e.id,[M.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=N(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=N(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[M.likec4_id]:e.id,[M.likec4_project]:e.projectId,[M.style]:e.line??rv});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(M.weight,i.weight);let o=tv(e);if(o&&a.attributes.set(M.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}return a}};const xv=Br(1),Sv=bi.getChild(`graphviz-wasm`);var Cv=class e{static _graphviz=null;static opsCount=0;get concurrency(){return 1}dispose(){ai.unload(),e._graphviz=null}[Symbol.dispose](){this.dispose()}graphviz(){return Promise.resolve().then(async()=>(e._graphviz||=(Sv.debug`loading wasm`,e.opsCount=0,ai.load()),await e._graphviz))}async attempt(t,n,r){return await xv(async()=>{try{let t=await r();return++e.opsCount>=10&&(Sv.debug`unloading wasm`,ai.unload(),e._graphviz=null),t}catch(r){Sv.error(`FAILED GraphvizWasm. ${t}`,{error:r}),Sv.error(`FAILED DOT:
1197
+ `+n),ai.unload(),e._graphviz=null}Sv.warn(`Retrying...`),await ja(10,500);try{return await r()}finally{ai.unload(),e._graphviz=null}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await this.graphviz()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await this.graphviz()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await this.graphviz()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await this.graphviz()).layout(e,`svg`))}};const wv=({view:e,styles:t})=>{switch(!0){case Ro(e):return new lv(e,t);case Lo(e):return new cv(e,t);case Fo(e):return new dv(e,t);default:F(e)}},Tv=bi.getChild([`layouter`]);var Ev=class{graphviz;constructor(e){this.graphviz=e??new Cv}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e}async dotToJson(e){let t;try{t=await this.graphviz.layoutJson(e)}catch(t){throw Tv.error(ci(t)),Tv.error`Failed to convert DOT to JSON:\n${e}`,t}try{return JSON.parse(t)}catch(n){throw Tv.error(ci(n)),Tv.error`Failed to parse JSON:\n${t}\n. Generated from DOT:\n${e}`,n}}async layout(e){try{Tv.debug`layouting view ${e.view.id}...`;let t=await this.dot(e),{view:n}=e,r=vv(await this.dotToJson(t),n);return n.manualLayout&&(r=O_(r,n.manualLayout)),Ro(r)&&Object.assign(r,{sequenceLayout:R_(r)}),t=t.split(`
1198
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${ov}`))).join(`
1199
+ `),Tv.debug`layouting view ${e.view.id} done`,{dot:t,diagram:r}}catch(t){throw Error(`Error during layout: ${e.view.id}`,{cause:t})}}async svg(e){let t=await this.dot(e);return t=t.split(`
1200
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${ov}`))).join(`
1201
+ `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=wv(e).print();if(!Fo(e.view))return t;try{return await this.graphviz.unflatten(t)}catch(n){return Tv.warn(`Error during unflatten: ${e.view.id}`,{error:n}),t}}async layoutProjectsView(e){Tv.debug`layouting projects overview...`;let t=new bv(e).print();try{t=await this.graphviz.unflatten(t)}catch(e){Tv.warn(`Error during unflatten of projects view`,{error:e})}let n=await this.dotToJson(t);return Tv.debug`layouting projects overview done`,yv(n,e)}};const Dv=bi.getChild([`layouter`,`queue`]);var Ov=class extends Ev{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new ar({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){return this.isProcessingBatch?(Dv.debug`waiting for batch to finish`,await this.queue.onIdle(),await Ma(),await this.runInQueue(e)):(this.queue.size>this.queue.concurrency*2+1&&(Dv.debug`task limit reached: ${this.queue.size} (pending: ${this.queue.pending}), waiting queue to shrink to ${this.queue.concurrency}`,await this.queue.onSizeLessThan(this.queue.concurrency+1)),Dv.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,Dv.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){Dv.debug`adding layoutProjectsView task to queue`;let t=await this.runInQueue(async()=>(Dv.debug`layouting projects view`,await super.layoutProjectsView(e)));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){if(this.isProcessingBatch)return Dv.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await Ma(),await this.batchLayout(e);if(e.cancelToken?.isCancellationRequested)return Dv.debug`cancellation requested`,[];let t=this.queue.concurrency;Dv.debug`starting batch layout, size: ${e.batch.length}, concurrency: ${t}`,this.isProcessingBatch=!0;let n=[];try{for(let r of e.batch)if(Dv.debug`add task for view ${r.view.id}`,this.queue.add(async()=>(t<=2&&await Ma(),await super.layout(r))).then(t=>{if(!t){e.onError?.(r,Error(`Layout queue returned null for view ${r.view.id}`));return}n.push(t),e.onSuccess?.(r,t)}).catch(t=>{Dv.error(`Fail layout view ${r.view.id}`,{err:t}),e.onError?.(r,t)}),this.queue.size>t+2&&(Dv.debug`task limit reached: ${this.queue.size}, waiting queue to shrink to ${t}`,await this.queue.onSizeLessThan(t+1),e.cancelToken?.isCancellationRequested)){Dv.debug`cancellation requested`;break}}finally{await this.queue.onIdle(),Dv.debug`batch layout done`,this.isProcessingBatch=!1}return n}dispose(){this.queue.clear(),super.dispose()}},kv=class extends je{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!Jl(e)&&!Wl(e)&&!Du(e))return super.getDocumentation(e);try{let t=me(e);if(t.state<_.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case Jl(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Wl(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=V.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
1202
+ `)}case Du(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
1203
+ `):void 0}default:return e}}catch(e){G(e)}}};function Av(e,t){return[e,t]=jv(e,t)>0?[t,e]:[e,t],Mv(e.range,t.range.start)}function jv(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function Mv(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function Nv(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:We.newLine({allowMore:!0}),oneSpace:We.oneSpace(),noSpace:We.noSpace(),indent:We.indent({allowMore:!0}),noIndent:We.noIndent()};var Pv=class extends ze{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Tp,(e,t)=>{let n=nt(e.$cstNode,`values`).filter(b).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,eu,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...D([e.target,e.tags],b)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,Xu,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Mf(e)||eu(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...D([e.target,e.tags],b)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,Ac,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(fm(e)&&Nv(e.$cstNode)||mm(e)&&fm(e.$container)&&Nv(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&Nv(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){Yd(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(Zd(e)||mp(e)||op(e)||up(e)||ip(e)||Sd(e)||wd(e)||Ed(e)||bd(e)||vd(e)||Ed(e)||ff(e)||ku(e)||nd(e)||Pf(e)||Jf(e)||uf(e)||gf(e)||Gu(e)||gu(e)||ou(e)||Hp(e)||Ip(e)||Bl(e)||Hl(e)||zu(e)||wu(e)||mf(e)||Xl(e)||nu(e)||Kl(e)||Qu(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=Nv(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!Av(o,e))&&t.cst([e]).prepend(We.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(We.newLine({allowMore:!0})):i.prepend(We.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,ju)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,Uu,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,mu)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,iu)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(Lu(e)||Kf(e)||Wp(e)||Sf(e)||wf(e)||cp(e)||fp(e)||Ll(e)||$d(e)||Nl(e)||Fd(e)||Qf(e)||Fl(e)||Ef(e)||vf(e)||jd(e)||Ld(e)||Nd(e)||ep(e)||Af(e)||Dp(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,tf,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,bf)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,Ap,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,cf,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Du,(e,t)=>{let n=de(e.$cstNode,`kind`),r=de(e.$cstNode,`name`);r&&n&&(jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,ed,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,wd,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Ed,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,bd,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,vd,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,Vd,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,zd,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((op(e)||up(e)||gp(e)||ip(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),np(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(fd(e)||Rf(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,Jl,(e,t)=>{let n=de(e.$cstNode,`kind`),r=de(e.$cstNode,`name`);r&&n&&(jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,Wl,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Pp,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Mp(e)||bu(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Ip,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,Hp)?.keyword(`style`).append(X.oneSpace),this.on(e,uu)?.keyword(`style`).append(X.oneSpace),this.on(e,Ju)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,cd)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(If(e)||ud(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Ol,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,nm,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),El(e)||cm(e)||em(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,xl,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,Xp,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),yl(e)||Qp(e)||Jp(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Oc(e)||Rp(e)||cu(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!Nv(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(Ju(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&Nv(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,Ud,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,Gd,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Of,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,fu,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Oc(t)||Rp(t)||cu(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,ll)?.property(`value`),t??=this.on(e,Du)?.properties(`props`),t??=this.on(e,Vd)?.properties(`project`),t??=this.on(e,Mf)?.properties(`title`,`technology`),t??=this.on(e,Ip)?.properties(`title`),t??=this.on(e,Ac)?.properties(`title`),t??=this.on(e,Jl)?.properties(`title`),t??=this.on(e,Wl)?.properties(`title`),t??=this.on(e,eu)?.properties(`title`,`technology`),t??=this.on(e,tf)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function Fv(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function Iv(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=Fv(t,e),a=Fv(r,e),o=i.length>0&&a.length>0?Ft($i(en(i),en(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var Lv=Pn(),Rv=t(Fn(),1);function zv(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function Bv(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function Vv(e){let t=zv([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new zr({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=Yt(w(n,x(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,Rv.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&w(Fv(o,e.nodes),bn(e=>e.inEdges.includes(t.id)),Gt(e=>{i.mergeNode(e.id),(0,Rv.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,Rv.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,Rv.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,Rv.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,Lv.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:Bv(zv(u)),edges:s}}function Hv(e){return e.hash=Ba({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:w(e.nodes,x(e=>({id:e.id,icon:b(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:so(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),Et(({id:e,...t})=>[e,t])),edges:w(e.edges,x(e=>({source:e.source,target:e.target,label:e.label,description:so(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),Et(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var Uv=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},Wv=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(ya(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(Ot(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),ya(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=z(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=Ia(t,e.elements),t=w(t,ba(t=>e.explicits.has(t)&&!Da(e.final,sa(t))),Oa()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=z(e.explicits,t),e.final=z(e.final,t)),e}removeElements(e){return e.elements=z(e.elements,this.excluded.elements),e.explicits=z(e.explicits,this.excluded.elements),e.final=z(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=z(n,e.explicits),e.final=z(e.final,n),e)}precommit(e){return e}postcommit(e){return P(z(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(z(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Tg(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},Gv=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return Dg([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(ya(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(ya(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(ya(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=Yt(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(Dg([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=Fa(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=Ia(e.elements,Fa(e.explicits,this.explicits)),e.final=Ia(e.elements,Fa(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function Kv(e,t=`final`){let n=ga(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new Hn.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new Hn.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(_g.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var qv=class extends Wv{};function Jv(e){if(U.isCustom(e))return Jv(e.custom.expr);if(U.isWhere(e)){let t=Jv(e.where.expr),n=jo(e.where.condition);return e=>t(e)&&n(e)}if(U.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(U.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(U.isWildcard(e))return()=>!0;if(U.isModelRef(e)){let t=V.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||ra(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function Yv(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!wt(o);w(n,D(kt(uo)),D(t),Gt(t=>{t.shape=r??t.shape,t.color=i??t.color,Vt(a)&&(t.icon=a),Vt(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function Xv(e,t){for(let n of e)!Po(n)||n.targets.length===0||Yv(n,_n(n.targets.map(Jv)),t);return t}var Zv=class e{static kind=lo;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},Qv=class extends Wv{excludeRelations(e){return w(this.memory.connections,D(t=>za(t.relations,e)),Gt(t=>{this.excludeConnections(t.update(Ia(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=z(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=z(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},$v=class extends Qv{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:ey,findConnectionsBetween:ty}=Rg;var ny=class extends Gv{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ya(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(ey(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(ty(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(ty(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(ty(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return So.isRelationExpr(this.expression)||w(e,Gt(({source:e,target:t,boundary:n})=>{w(Sn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Jt(([e,t])=>e===t),Xt(1),Gt(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},ry=class extends ny{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},iy=class e extends Uv{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new ny(this,e)}stageExclude(e){return new Qv(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},ay=class e extends iy{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=Vn.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new Zv(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new Zv(r,n,null));let a=Vn.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new ry(this,e)}stageExclude(e){return new $v(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new iy(t,this.scope)}};function oy(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function sy(e){let{id:t,title:n,...r}=Dn(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return B({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:Xa(e.$element),tags:[...e.tags],...r})}function cy({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:lo,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:B({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(pa).forEach(({id:e,...t})=>{let n=ra(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=ra(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,oy(o,r)),o.children.push(e),a=o.level+1);let c=B({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function ly(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...kn(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function uy(e,t){let n=w(e,gn((e,t)=>(b(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),b(t.description)&&!e.description.some(jt(t.description))&&e.description.push(t.description),b(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),b(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),b(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),b(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),b(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),b(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),b(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=On(n.title)??(n.title.length>1?`[...]`:void 0),i=qt(n.tags),a=B({title:r,description:On(n.description),technology:On(n.technology),kind:On(n.kind),head:On(n.head),tail:On(n.tail),color:On(n.color),line:On(n.line),navigateTo:On(n.navigateTo),...ta(i)&&{tags:i}});if(t){let e=ly(t);a=En({...a,...e},b)}return S(a.title)&&b(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:dy,findConnectionsBetween:fy,findConnectionsWithin:py}=Pg;function my(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function hy(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function gy(e){if(H.isWildcard(e))return()=>!0;if(H.isElementTagExpr(e)||H.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(H.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>ra(e.id)===t:e=>e.id===t}if(H.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?ra(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function _y(e){return Xa(e.$instance)??Xa(e.element.$element)}function vy(e){let t=e.id,n=e.onlyOneInstance();return B({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:E(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:Xa(e.$node)??void 0,tags:[...e.tags],style:Dn(e.style,[`icon`,`shape`,`color`])})}function yy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return B({id:e.id,kind:`instance`,title:e.title,description:_y(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:E(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function by(e){return e.isInstance()?yy(e):vy(e)}function xy(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(E(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=uy(n.map(e=>e.$relationship)),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function Sy(e,t){let n=cy(e.$styles,[...t.final].map(by));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=_y(r)??null,t.technology??=r.technology,wt(t.tags)&&(t.tags=[...r.tags]),(!t.links||wt(t.links))&&E(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function Cy(e,t){for(let n of e)!Po(n)||n.targets.length===0||Yv(n,_n(n.targets.map(gy)),t);return t}function wy(e){let t=new Hn.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new Hn.default(()=>new Set);for(let[e,r]of t)E(r,2)&&w(r,C(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),At(T(`group`)),yn(),D(E(2)),Gt(Kt(x(T(`conn`)),Cg(`desc`),Jt((e,t,n)=>t===0||e.boundary===n[t-1].boundary),Gt(t=>{n.get(t).add(e)}))));return n}function Ty(e){e=Dg(e);let t=wy(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=Ia(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=Fa(Ia(n.relations.model,e.internalModelRelationships()),Ia(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return w(t.entries(),Ea(([e,t])=>e.update({model:t,deployment:null})),L())}function Ey(e){return Og(e,Ty(e))}function Dy(e){return w(e,Dg,gn((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=ag.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=dy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)bg(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new yg(r,i,o)),t},[]))}function Oy(e){return Og(e,Dy(e))}var ky=class extends Gv{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ya(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(dy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(fy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(fy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(fy(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=w(e,Ey,Oy);return w(t,Gt(({source:e,target:t,boundary:n})=>{w(Sn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Jt(([e,t])=>e===t),Xt(1),Gt(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},Ay=class e extends Uv{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new ky(this,e)}stageExclude(e){return new qv(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&jt(this.state,t.state)}diff(e){return{added:{elements:L(z(e.elements,this.elements)),explicits:L(z(e.explicits,this.explicits)),final:L(z(e.final,this.final)),connections:L(Og(e.connections,this.connections))},removed:{elements:L(z(this.elements,e.elements)),explicits:L(z(this.explicits,e.explicits)),final:L(z(this.final,e.final)),connections:Og(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
1204
+ `)}[vg](e,t,n){return this.toString()}};const jy={include:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},My={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=Ky(fy(e,[...Zy(e)],`directed`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=my(t,e.incoming);for(let e of a){let t=Ky(fy(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.incoming)||H.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.incoming))return Wy(Py(t,e.incoming),{stage:r,memory:n},i);if(H.isWildcard(e.incoming))return r;let a=Ny(my(t,e.incoming)),o=w(n.connections,D(a),Ky(i));return r.excludeConnections(o),r}};function Ny(e){return _n(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function Py(e,t){let n=hy(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const Fy={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of Zy(e)){let n=Ky(dy(t,e,`directed`),i);r.addConnections(n)}return r}P(H.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=my(t,e.outgoing);for(let e of o){let t=Ky(fy(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.outgoing)||H.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.outgoing))return Wy(Ly(t,e.outgoing),{stage:r,memory:n},i);if(H.isWildcard(e.outgoing))return r;let a=Iy(my(t,e.outgoing)),o=w(n.connections,D(a),Ky(i));return r.excludeConnections(o),r}};function Iy(e){return _n(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function Ly(e,t){let n=hy(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const Ry={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(H.isElementTagExpr(e)||H.isElementKindExpr(e)||H.isElementTagExpr(t)||H.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!H.isModelRef(e),`Invalid source model ref in direct relation`),P(!H.isModelRef(t),`Invalid target model ref in direct relation`);let o=H.isWildcard(e),s=H.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=w(py(r.instances()),Ky(a),x(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=my(r,e),i=Iy(t),o=i;if(n){let e=Ny(t);o=t=>i(t)!==e(t)}l=w(t,C(e=>fy(e,Zy(e),c)),D(o),Ky(a));break}case o&&!s:{let e=my(r,t),i=Ny(e),o=i;if(n){let t=Iy(e);o=e=>t(e)!==i(e)}l=w(e,C(e=>[...Zy(e)].flatMap(t=>dy(t,e,c))),D(o),Ky(a));break}default:{P(!o,`Inference failed - source should be a deployment ref`),P(!s,`Inference failed - target should be a deployment ref`);let n=my(r,e),i=my(r,t),u=Iy(n),d=Ny(i);l=w(n,C(e=>fy(e,i,c)),D(e=>u(e)&&d(e)),Ky(a))}}return i.addConnections(l),H.isDeploymentRef(e)&&Mt(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),H.isDeploymentRef(t)&&Mt(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=gy(e.target),o=gy(e.source),s;switch(!0){case H.isWildcard(e.source)&&H.isWildcard(e.target):return r.excludeConnections(Ky(n.connections,i)),r;case H.isModelRef(e.source)&&H.isModelRef(e.target):return s=zy({source:e.source,target:e.target,expr:e,model:t}),Wy(s,{stage:r,memory:n},i);case H.isModelRef(e.source)&&H.isWildcard(e.target):return s=Ly(t,e.source),Wy(s,{stage:r,memory:n},i);case H.isModelRef(e.source):return s=Ly(t,e.source),Wy(s,{stage:r,memory:n},i,e=>a(e.target));case H.isModelRef(e.target):return s=Py(t,e.target),Wy(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=w(n.connections,D(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),Ky(i));return c.length===0||r.excludeConnections(c),r}}};function zy({source:e,target:t,expr:n,model:r}){let i=hy(r,e),a=hy(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...Bg(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const By={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.inout)){for(let e of a){let t=Jy(fy(e,[...Zy(e)],`both`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=my(t,e.inout);for(let e of a){let t=Jy(fy(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.inout)||H.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.inout)){let a=hy(t,e.inout);return a.length===0?r:Wy(Fa(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(H.isWildcard(e.inout))return r;let a=my(t,e.inout),o=Ny(a),s=Iy(a),c=w(n.connections,D(e=>o(e)!==s(e)),Ky(i));return r.excludeConnections(c),r}},Vy={include:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Hy={include:({model:e,stage:t,where:n})=>{let r=[],i=w([...e.roots()],qy(n),x(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(py([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=w([...t.elements],qy(n));return e.exclude(r),e}};function Uy(e,{expr:t,where:n,...r}){switch(!0){case H.isElementTagExpr(t):case H.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case yo.isCustom(t):case H.isCustom(t):case H.isModelRef(t):return;case H.isWhere(t):return jy[e]({...r,expr:t,where:n});case yo.isWhere(t):return Vy[e]({...r,expr:t,where:n});case H.isDeploymentRef(t):return Qy[e]({...r,expr:t,where:n});case H.isWildcard(t):return Hy[e]({...r,expr:t,where:n});case yo.isDirect(t):return Ry[e]({...r,expr:t,where:n});case yo.isInOut(t):return By[e]({...r,expr:t,where:n});case yo.isOutgoing(t):return Fy[e]({...r,expr:t,where:n});case yo.isIncoming(t):return My[e]({...r,expr:t,where:n});default:F(t)}}function Wy(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=w(n.connections,D(e=>i(e)),D(t=>za(t.relations.model,e)),x(t=>t.update({deployment:null,model:Ia(t.relations.model,e)})),Ky(r),D(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function Gy(e,t){return Ky(e,t).nonEmpty()}function Ky(...e){if(e.length===1)return t=>Ky(t,e[0]);let[t,n]=e;return n===null?t:Bt(t)?t.map(e=>Ky(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(Xy(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(Xy(t)(e))))})}function qy(...e){if(e.length===1)return t=>qy(t,e[0]);let[t,n]=e;return Bt(t)?t.filter(e=>qy(e,n)):n?.(Yy(t,t))??!0}function Jy(e,t){return t?w(e,D(e=>Gy(e,t))):e}function Yy(e,t){if(Kg(e)){let n=Wg(t)&&Ug(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]]}}if(Gg(e))return kn(e.element,[`tags`,`kind`]);if(Ug(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags]};if(Hg(e))return kn(e,[`tags`,`kind`]);F(e)}function Xy(e){return t=>({tags:t.tags,kind:t.kind,source:Yy(t.source,e.source),target:Yy(t.target,e.target)})}function Zy(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const Qy={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(Ug(r))return qy(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:eb(r,e);break;case t.selector===`children`:$y(r,e);break;case t.selector===`descendants`:tb(r,e);break;default:qy(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=gy(e),a=w([...n.elements],D(i),qy(r));return t.exclude(a),t}};function $y(e,{stage:t,where:n}){let r=qy([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(py(r)),t.connectWithExisting(r),t.addExplicit(r))}function eb(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=qy([...e.children()],r),a=!1;for(let e of i)if(fy(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(py(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function tb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),qy(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(py(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=nb(t);w(i,D(e=>a.has(e)),Gt(e=>t.addExplicit(e)))}function nb(e){return w(e.mergedConnections(),Ey,Oy,gn((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var rb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=w(e.connections,Ey,Oy),n=Og(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=Fa(this.memory.elements,e.elements),n=Fa(e.final,this.memory.explicits),r=new Hn.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return w(z(t,i),ba(e=>e.isDeploymentNode()),L(),ma,Gt(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&Da(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=Kv(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=On([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=On(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function ib(e,t){let n=Ay.empty();for(let r of t)if(No(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=Uy(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return rb.for(n).commit()}function ab(e,{docUri:t,rules:n,...r}){let i=ib(e.deployment,n),a=Sy(e,i),o=xy(i.connections);Iv(a,o);let s=Vv({nodes:a,edges:o}),c=Cy(n,s.nodes),l=Cn(n,Ho),u=Vs(c);return Hv({...r,[no]:`computed`,[ro]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:x(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function ob(e){return t=>Ko(t)?t.groupRules.flatMap(ob(e)):No(t)&&`include`in t?t.include.filter(e):[]}function sb(e,t){let n=e.flatMap(ob(U.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=Tt(t,S),p=B({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!An(p),h=!An(f),g=Jv(e);r.forEach((e,t)=>{uo(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function cb(e,t){return e.reduce((e,n)=>{if(Bo(n)){let r=t.predicates[n.predicateId];return S(r)?e:e.concat(r)}if(zo(n)){let r=t.styles[n.styleId];return S(r)?e:e.concat(r)}return e.push(n),e},[])}function lb(e,t){return e.reduce((e,n)=>{if(Bo(n)){let r=t.dynamicPredicates[n.predicateId];return S(r)?e:e.concat(r)}if(zo(n)){let r=t.styles[n.styleId];return S(r)?e:e.concat(r)}return e.push(n),e},[])}function ub(e,t){let n=new Set;for(let r of t)if(No(r))for(let t of r.include){let r=Jv(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const db=e=>{if(Wo(e)){let t=[],n=[];for(let r of e.__parallel)if(Go(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return Go(e)?[...e.__series]:e};function fb(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of C(t,db)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function pb(e,t,n){let r=zg(e,t,`directed`).flatMap(e=>[...e.relations]).sort(Pa);if(!ta(r))return{};if(r.length===1){let e=r[0];return B({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=w(r,C(e=>e.tags),qt()),a=E(i,1)?i:void 0,o=x(r,e=>e.id),s=$t(r).$relationship.navigateTo;s===n&&(s=void 0),s||=w(r,C(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),qt(),On());let c=w(r,gn((e,{title:t,technology:n,$relationship:r})=>(b(t)&&e.title.add(t),b(r.color)&&e.color.add(r.color),b(r.line)&&e.line.add(r.line),b(r.kind)&&e.kind.add(r.kind),b(n)&&e.technology.add(n),b(r.description)&&!e.description.some(jt(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return B({tags:a??void 0,relations:o,navigateTo:s,kind:On([...c.kind]),title:On([...c.title]),color:On([...c.color]),line:On([...c.line]),technology:On([...c.technology]),description:On(c.description)})}var mb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=lb(t,this.model.globals),a=ub(this.model,i),o=fb(this.model,n),s=w(Fa(Ia(a,o),o,a),L(),ga),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(Go(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?go(n,t):go(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),ee=s.indexOf(g);P(ee>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:te,relations:ne,navigateTo:re,...ie}=pb(m,g,this.view.id),ae=b(d)&&d!==this.view.id?d:re,oe=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(B({...ie,...p,...oe&&{technology:oe},id:r,source:m,target:g,navigateTo:ae,title:o??te,relations:ne??[],isBackward:h>ee})),t+1},u=1;for(let e of n){if(Wo(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=cy(this.model.$styles,s.map(sy)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:ua(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=ra(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of da(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of da(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=sb(i,Xv(i,s.map(e=>N(d.get(e.id))))),h=Cn(i,Ho),g=Vs(m);return Hv({...r,[ro]:`dynamic`,[no]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:x(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function hb(e,t){return new mb(e,t).compute()}function gb(e){switch(!0){case xo.isCustom(e):return gb(e.customRelation.expr);case xo.isWhere(e):{let t=gb(e.where.expr),n=jo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind},target:{tags:e.target.tags,kind:e.target.kind},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind}})}case xo.isDirect(e):{let t=Jv(e.source),n=Jv(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case xo.isInOut(e):{let t=Jv(e.inout);return e=>t(e.source)||t(e.target)}case xo.isIncoming(e):{let t=Jv(e.incoming);return e=>t(e.target)}case xo.isOutgoing(e):{let t=Jv(e.outgoing);return e=>t(e.source)}default:F(e)}}function _b(e,t,n){let r=e.flatMap(ob(xo.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:oo(a)}:{},c=o?{notes:oo(o)}:{},l=Tt(s,S),u=gb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...kn(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function vb(e){return w([...e],Dg,gn((e,t,n,r)=>{let i=Eg(r,t),a=Fa(...i.map(T(`relations`))),o=Ia(t.relations,a);if(i.length>0&&(o=Fa(o,t.directRelations)),xg(r,t.reversed())&&(o=Fa(o,t.directRelations)),o.size<t.relations.size){let e=r.some(Mg(t.source)),n=r.some(Mg(t.target));e&&(o=Fa(o,Oa(ba(t.relations,Ag(t.source))))),n&&(o=Fa(o,Oa(ba(t.relations,jg(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var yb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=vb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=Fa(this.memory.elements,e.elements),n=Fa(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return w(z(t,r),L(),ma,Gt(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&Da(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=Kv(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=On([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=On(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:bb,findConnectionsBetween:xb,findConnectionsWithin:Sb}=Rg;function Cb(e,t){switch(!0){case U.isElementKindExpr(t):return[...ba(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case U.isElementTagExpr(t):return[...ba(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(V.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(V.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case U.isModelRef(t):return[e.element(V.flatten(t.ref))];default:F(t)}}function wb(e,t){if(t.isEmpty()||e.length===0)return e;let n=_n(e.map(e=>sa(e))),r=L(ba(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function Tb(e,{memory:t,model:n}){let r=Cb(n,e);return U.isModelRef(e)?e.selector===`descendants`?r:wb(r,t):r}const Eb={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(V.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(Sb(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},Db={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Sb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},Ob={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Sb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},kb=()=>!0,Ab=e=>e;function jb(e){return e.reduce((e,t)=>{let n=[...t.relations];P(E(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=uy(n.map(e=>e.$relationship),On(D(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function Mb(e,t){return cy(e.$styles,[...t.final].map(sy),t.groups)}const Nb=U.isWildcard,Pb=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Fb={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=Nb(e),l=Nb(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==kb:{let e=w(i.relationships(),ba(o),L(),x(e=>new Ng(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==kb:u.push(...Sb(r.elements));break;case c&&l:u.push(...Sb(i.roots()));break;case!c&&l&&o!==kb:{let t=w(Cb(i,e),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ba(o),ka(),L(),Yt(t=>t.source===e),([t,n])=>Tn(w(t,D(t=>!Pb(e,t.target)),x(t=>new Ng(e,t.target,new Set([t])))),w(n,D(t=>!Pb(e,t.source)),x(t=>new Ng(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=Ib(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...xb(e,a,o));break}case c&&!l&&o!==kb:{let e=w(Cb(i,t),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ba(o),L(),Yt(t=>t.target===e),([t,n])=>Tn(w(n,D(t=>!Pb(e,t.target)),x(t=>new Ng(e,t.target,new Set([t])))),w(t,D(t=>!Pb(e,t.source)),x(t=>new Ng(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=Ib(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...xb(t,e,o));break}default:{P(!Nb(e),`Inference failed - source must be not a wildcard`),P(!Nb(t),`Inference failed - target must be not a wildcard`);let a=Tb(e,{memory:r,model:i}),o=Tb(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...xb(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=Nb(e),c=Nb(t),l;switch(!0){case s&&c:l=w(i.connections,C(Kt(T(`relations`),ba(o),L())),Oa());break;case!s&&c:l=w(Cb(r,e),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ba(o),L())),Oa());break;case s&&!c:l=w(Cb(r,t),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ba(o),L())),Oa());break;default:{P(!Nb(e),`Inference failed - source must be not a wildcard`),P(!Nb(t),`Inference failed - target must be not a wildcard`);let i=Cb(r,e),a=Cb(r,t),s=new Set;for(let e of i)for(let t of a)oa(e,t)||(s=Fa(s,Ia(e.allOutgoing,t.allIncoming),n?Ia(t.allOutgoing,e.allIncoming):new Set));l=Oa(ba(s,o))}}return a.excludeRelations(l),a}};function Ib(e,{memory:t,model:n}){let r=Cb(n,e);if(!E(r,1))return[[],[]];if(U.isModelRef(e)){let i=L(n.element(V.flatten(e.ref)).ascendingSiblings());return[wb(r,t),wb(i,t)]}return[r,w(r,x(e=>e.ascendingSiblings()),Sa(),ka(),L(),e=>wb(e,t))]}const Lb={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(U.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...bb(e,t,`directed`))}else{let e=Tb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...qt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=Rb(n,o);for(let n of t)s.push(...xb(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function Rb(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=Jv(t);return t=>e(t.target)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return _n([...e.children(n)].map(e=>_g.isIncoming(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return _n([_g.isInside(n),...[...e.children(n)].map(e=>_g.isIncoming(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return _n([_g.isIncoming(e),_g.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return _g.isIncoming(e)}default:F(t)}}const zb={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(U.isWildcard(e)){if(!t)return;o.push(...xb(t,t.ascendingSiblings()))}else{let t=Tb(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=qt(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...xb(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(Oa(a.filter(i))),r}},Bb={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(U.isWildcard(o)){if(!t)return;s.push(...xb(t,t.ascendingSiblings(),`directed`))}else{let e=Tb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...qt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=Vb(n,o);for(let n of e)s.push(...xb(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(Oa(a.filter(i))),r}};function Vb(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=Jv(t);return t=>e(t.source)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return _n([...e.children(n)].map(e=>_g.isOutgoing(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return _n([_g.isInside(n),...[...e.children(n)].map(e=>_g.isOutgoing(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return _n([_g.isOutgoing(e),_g.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return _g.isOutgoing(e)}default:F(t)}}const Hb={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=Yt(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(Sb(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(ba(e.children(),i)),s=o.length>0;if(!s)if(a){if(xb(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=Oa([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(xb(e,o,`directed`));s&&(n.addConnections(Sb(o)),n.addExplicit(o));for(let e of o)n.addConnections(xb(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===kb?e?(n.exclude([e,...e.descendants()]),n):iy.empty(t.scope).stageExclude(n.expression):(n.exclude(D([...t.elements],r)),n)};function Ub(e,t,n){switch(!0){case U.isCustom(e):return t===`include`?Ub(e.custom.expr,t,n):n.stage;case U.isWhere(e):{let r=jo(e.where.condition),i=e=>D(e,r);return Ub(e.where.expr,t,{...n,where:r,filterWhere:i})}case U.isModelRef(e)&&e.selector===`expanded`:return Eb[t]({...n,expr:e})??n.stage;case U.isWildcard(e):return Hb[t]({...n,expr:e})??n.stage;case U.isElementKindExpr(e):case U.isElementTagExpr(e):return Db[t]({...n,expr:e})??n.stage;case U.isModelRef(e):return Ob[t]({...n,expr:e})??n.stage;default:F(e)}}function Wb(e,t,n){switch(!0){case xo.isCustom(e):return t===`include`?Wb(e.customRelation.expr,t,n):n.stage;case xo.isWhere(e):{let r=jo(e.where.condition),i=e=>new Set(D([...e],r)),a=e=>w(e,x(e=>new Ng(e.source,e.target,i(e.relations))),D(e=>e.nonEmpty()));return Wb(e.where.expr,t,{...n,where:r,filterWhere:a})}case xo.isInOut(e):return zb[t]({...n,expr:e})??n.stage;case xo.isDirect(e):return Fb[t]({...n,expr:e})??n.stage;case xo.isOutgoing(e):return Bb[t]({...n,expr:e})??n.stage;case xo.isIncoming(e):return Lb[t]({...n,expr:e})??n.stage;default:F(e)}}function Gb(e,t,n){let r={model:e,scope:t.scope,where:kb,filterWhere:Ab};for(let i of n){if(Ko(i)){t=Gb(e,ay.enter(t,i),i.groupRules),P(t instanceof ay,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(No(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case So.isFqnExpr(i):n=Ub(i,e,{...r,stage:n,memory:t})??n;break;case So.isRelationExpr(i):n=Wb(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function Kb(e,t,n){return t=Gb(e,t,n),yb.for(t).commit()}function qb(e,{docUri:t,rules:n,...r}){let i=cb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=Kb(e,iy.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=Yb(o);let s=Mb(e,o),c=jb(o.connections);Iv(s,c);let l=Vv({nodes:s,edges:c}),u=sb(i,Xv(i,l.nodes)),d=Cn(i,Ho),f=Vs(u),p=Jb(i,u);return Hv({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:_b(i,u,l.edges),nodes:x(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function Jb(e,t){let n=[];for(let r of e){if(!qo(r)||r.targets.length===0)continue;let e=w(t,D(_n(r.targets.map(Jv))),x(e=>e.id));E(e,1)&&n.push({type:r.rank,nodes:e})}return n}function Yb(e){if(e.groups.length===0)return e;let t=new Hn.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(w(ga([...e.explicitFirstSeenIn.keys()]),Gt(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),w(ga([...e.lastSeenIn.keys()]),D(e=>!n.has(e)),Gt(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function Xb(e,t){switch(!0){case Fo(e):return qb(t,e);case Lo(e):return ab(t,e);case Ro(e):return hb(t,e);default:F(e)}}function Zb(e,t){try{return{isSuccess:!0,view:Xb(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function Qb(e){let t=new zr({type:`directed`}),n=[];for(let r of yn(e))t.addNode(r.id,{view:r}),Io(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,Rv.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,Lv.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!Io(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!Fo(i))return e;let a=qt([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:ta(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const $b=e=>cn(e).length,ex=e=>Va(e);function tx(e){let t=nx(e),n=(e,t)=>`${e}->${t}`,r=new Hn.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!wt(t.$data.imports))for(let[e,n]of on(t.$data.imports))for(let r of n){let n=po(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(E(i,1),`Relationships set must have at least one relationship`);let a={id:Va(e),source:ex(t),target:ex(n),projectId:t,relations:x(i,T(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:qt(C(i,T(`tags`)))},o=On(i);return o&&(a.label=o.title,a.description=Xa(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});Iv(t,o);let s=Vv({nodes:t,edges:o});return{id:`projects-view`,[ro]:`projects`,[no]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function nx(e){let t=new Map;for(let n of e){let e=ao(n.projectId),r={id:ex(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${$b(n.$data.elements)}`,`Relationships: ${$b(n.$data.relations)}`,`Views: ${$b(n.$data.views)}`].join(`
1205
+ `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function rx(e,t){return{...qb(e,{id:fo(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}De();const ix=W.getChild(`LanguageServices`),ax=e=>e.severity===Ge.Error;var ox=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof Hm?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=w(this.services.shared.workspace.LangiumDocuments.groupedByProject(),on(),x(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:x(n,T(`uri`)),config:a}}));if(E(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(E(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=x(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),T(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return gg.create({...r.$data,_stage:`layouted`,views:w(i,x(T(`diagram`)),Ht(T(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===gg.EMPTY){ix.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!E(n,1))throw Error(`No models found`);let r=tx(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return w(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),C(e=>w(e.diagnostics??[],D(ax),x(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}async dispose(){try{ix.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){ix.error(ci(e))}finally{ix.debug(`LikeC4LanguageServices disposed`)}}},sx=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){G(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function cx(e){try{let t=vp(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function lx(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function ux(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function dx(e){let t;for(;t=e.value?.ref;){if(Jl(t))return null;if(Wl(t))return t;if(S(e.parent))return null;e=e.parent}return null}function fx(e){let t=ux(e);return t?.$type===`Imported`?t:null}function px(e){let t;for(;t=e.value?.ref;){if(Sc(t))return!0;if(S(e.parent))return!1;e=e.parent}return!1}function mx(e){if(zd(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(Vd(e))}if(Vd(e))return e.project;let t=u(e)?me(e):e;return t.likec4ProjectId?t.likec4ProjectId:(W.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Fh.DefaultProjectId)}function hx(...e){return Va(e.length>1?e.join(`:::`):e[0])}function gx(e){try{return e()}catch(e){W.trace(`Safe call failed`,{error:e});return}}function _x(){try{return globalThis.performance.now()}catch{return Date.now()}}function vx(){let e=_x();return{get ms(){return _x()-e},get pretty(){return Vr(_x()-e)}}}var yx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if($m(e))return e.state<_.Linked&&(W.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,e.uri,n),W.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Zm.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=mx(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};De();const bx=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function xx(e,t){return ye(t.feature)&&t.property===`project`&&Vd(e.node)}var Sx=class extends ne{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case _e(t.feature):return this.completionForKeyword(e,t.feature,n);case ve(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case xx(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:v.Snippet,insertTextFormat:Pe.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&ge(e.node,gf):n(e,{label:t.value,detail:`Insert deployment view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
1206
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1|${Wi.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
1207
+ `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
1208
+ `)});break;case t.value===`dynamic`&&ge(e.node,gf):n(e,{label:t.value,detail:`Insert dynamic view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
1209
+ `)});break;case t.value===`style`&&e.node&&ge(e.node,wd):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${bx}|} $0\n}`});break;case t.value===`style`&&e.node&&ge(e.node,_n([gf,Ed])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${bx}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} {\n\t\${1|${bx}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:`extend $1 {
536
1210
  $0
537
- }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Ge.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Ge.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:v.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Ge.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=A(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:v.Folder,insertText:n,filterText:n,textEdit:Ie.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},pb=class extends Fe{createDocumentHighlight(e){return Uh.DocumentHighlight.create(e.segment.range,Uh.DocumentHighlightKind.Read)}},mb=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!mh(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:he(e.parseResult.value).filter(Td).map(t=>{try{let n=ae(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&ir(r))return{range:n,target:r}}catch(e){G(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(ir(t)||nr(t))return t;if(er(t))return Xn(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Xn(n.toString(),t)}relativeLink(e,t){if(nr(t))return sr(t);if(er(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return sr(tr(new URL(t,r).toString(),n))}return null}};Xe();const hb=W.getChild(`DocumentSymbolProvider`);var gb=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!mh(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<m.Linked&&(hb.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(m.Linked,e.uri,n),hb.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return G(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(D);return n.length===0?[]:[{kind:we.Namespace,name:`icons`,range:t.range,selectionRange:ne(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=ae(t,`name`);if(!n)return[];let r=T([...e.elements,...e.tags,...e.relationships],C(e=>{try{if(Af(e)||Pf(e)||Of(e))return this.getKindSymbol(e);if(Bf(e))return this.getTagSymbol(e)}catch(e){return G(e),null}F(e)}),k(D));return r.length===0?[]:[{kind:we.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=ae(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>ku(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=ae(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(Tu(e))return this.getExtendElementSymbol(e);if(Ql(e))return this.getElementSymbol(e)}catch(e){G(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:$y(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=ae(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=ae(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||A(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||A(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||A(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?ae(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(yl(e))return this.getDeploymentNodeSymbol(e);if(hl(e))return this.getDeployedInstanceSymbol(e);if(xu(e))return[]}catch(e){G(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=te(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}},_b=class extends Ce{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(Gf(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(yl(e)){let t=te(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=ja(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
538
- `)}}}if(hl(e)){let t=te(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=V.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${V.flatten(n.element)}\``];return a&&o.push(`### ${a.title}`,"element kind `"+a.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
539
- `)}}}if(nu(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(Cl(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(mf(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};if(Ql(e)){let t=this.locator.getParsedElement(e);if(!t)return;let n=[t.id,`### ${t.title}`,"element kind `"+t.kind+"` "],r=ja(t);return r&&n.push(``,r.md??r.txt),{contents:{kind:`markdown`,value:n.join(`
540
- `)}}}}},vb=De(),yb=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:vb.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[vb.TextEdit.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};Xe();const bb=W.getChild(`SemanticTokenProvider`),xb={...qe},Sb={...Ve};function Cb(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Sb)return t.push(Sb[i]),n;if(i in xb)return()=>e(xb[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const wb=`Stop Highlighting`,Tb=()=>{throw wb};var Eb=class extends Ke{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(mf,e=>{e.property(`name`).function()}),e(Li(tf,Zd,Tl),e=>{e.property(`kind`).function()}),e(_d,e=>{e.property(`name`).definition.function(),Tb()}),e(Li(Ud,ff),e=>{e.property(`value`).readonly.definition.interface(),Tb()}),e(Pp,e=>{e.cst().readonly.definition.variable(),Tb()}),e(Bu,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(qf,e=>{e.cst().type(),Tb()}),e(uf,e=>{e.cst().function(),Tb()}),e(wp,e=>{D(e.node.value)&&e.property(`value`).function()}),e(Li(Wc,Zc),e=>{D(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Li(Op,Ap),e=>{e.property(`participant`).keyword()}),e(iu,e=>{D(e.node.kind)&&e.property(`kind`).definition.type()}),e(Li(Xu,Ju),e=>{e.property(`id`).readonly.definition.variable()}),e(ip,e=>{e.property(`style`).readonly.definition.variable()}),e(Li(Wu,Hu),e=>{e.property(`name`).readonly.definition.variable()}),e(np,e=>{e.property(`predicate`).readonly.definition.variable()}),e(fu,e=>{D(e.node.tag)&&e.property(`tag`).definition.type()}),e(Li(Ru,Wf),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.$cstNode?.text;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable(),Tb()}),e(Hf,e=>{e.node.parent?e.property(`el`).property():(e.property(`el`).readonly.definition.variable(),Tb())}),e(Ef,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(Bf,e=>{D(e.node.color)&&e.keyword(`color`).property()}),e(Li(Af,Pf,Of),e=>{e.property(`kind`).readonly.declaration.type()}),e(Gf,e=>{e.property(`name`).definition.type()}),e(Yd,e=>{e.property(`value`).number()}),e(ad,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(Td,e=>{D(e.node.value)&&e.property(`value`).string()}),e(cl,e=>{D(e.node.customColor)&&e.property(`customColor`).enum(),D(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(td,e=>{D(e.node.customColor)&&e.property(`customColor`).enum(),D(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(Li(Sf,il,Cd,ol,Mc,rd,Ul),e=>{D(e.node.value)&&e.property(`value`).enum()})}async semanticHighlight(e,t,n=vb.CancellationToken.None){return e.state<m.Linked&&await this.ensureState(e,n),await super.semanticHighlight(e,t,n)}async semanticHighlightRange(e,t,n=vb.CancellationToken.None){return e.state<m.Linked&&await this.ensureState(e,n),await super.semanticHighlightRange(e,t,n)}async semanticHighlightDelta(e,t,n=vb.CancellationToken.None){return e.state<m.Linked&&await this.ensureState(e,n),await super.semanticHighlightDelta(e,t,n)}async ensureState(e,t){e.state<m.Linked&&(bb.debug`waiting for document ${e.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(m.Linked,e.uri,t),bb.debug`document ${e.uri.path} is ${`Linked`}`)}highlightElement(e,t){if(Li(Ql,yl,hl)(e))return this.highlightNameAndKind(e);if(gc(e))return this.highlightView(e);Us(e)&&!Li(vc,uu,vf)(e)&&D(e.key)&&t({node:e,property:`key`,type:qe.property});let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===wb)return`prune`;bb.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),hl(e)||this.mark(e).property(`kind`).keyword(),Ql(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>Cb((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>Cb((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>Cb((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}},Db=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},Ob=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const kb={mcpServer:()=>new Db,mcpServerFactory:()=>new Ob};var Ab=class extends Zy{projects;langiumDocuments;documentCache;workspaceCache;constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new kn.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Ze(e.shared,m.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(m.IndexedContent,e=>{mh(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>mh(e)&&e.state>=m.IndexedContent)}get(e){return e.state<m.IndexedContent&&G(`Document ${e.uri.path} is not indexed`),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){P(Ql(e)||qs(e));let t=ph.readId(e);if(D(t))return t;let n=te(e);return P(mh(n)),this.get(n),N(ph.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return Ue(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return Ue(this.workspaceCache.get(`${e}:rootElements`,()=>jb(this.documents(e).reduce((e,t)=>(this.get(t).rootElements().forEach(t=>{e.set(t.name,t)}),e),new On.default))))}directChildrenOf(e,t){return Ue(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>jb(this.documents(e).reduce((e,n)=>(this.get(n).children(t).forEach(t=>{e.set(t.name,t)}),e),new On.default))))}uniqueDescedants(e,t){return Ue(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let{children:n,descendants:r}=this.documents(e).reduce((e,n)=>{let r=this.get(n);return r.children(t).forEach(t=>{e.children.set(t.name,t)}),r.descendants(t).forEach(t=>{e.descendants.set(t.name,t)}),e},{children:new On.default,descendants:new On.default}),i=jb(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...Qi(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements);if(t.length===0)return Mb.EMPTY;let n=e.likec4ProjectId??this.projects.belongsTo(e),r=[],i=new On.default,a=new On.default,o=new On.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return ph.writeId(t,i),o.set(i,a),a},l=(e,t)=>{let n;if(Ql(e)){n=Ha(e.name,t);let a=c(e,e.name,n);t?i.set(t,a):r.push(a)}else n=$y(e.element);let o=[];if(mt(e.body)&&!A(e.body.elements)){for(let t of e.body.elements)if(!tf(t)&&!ku(t))try{o.push(...l(t,n))}catch(e){G(e)}}o=[...i.get(n)??[],...o];for(let e of o)a.set(n,e);if(Tu(e))for(let e of Ki(n))for(let t of o)a.set(e,t);return a.get(n)??[]};for(let e of t)try{if(tf(e)||ku(e))continue;l(e,null)}catch(e){G(e)}return new Mb(r,i,a,o,n)}};function jb(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>ji(e.name,t.name))}var Mb=class e{static EMPTY=new e([],new On.default,new On.default,new On.default,Hh.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}},Nb=class extends Ab{Names;constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements);if(t.length===0)return Mb.EMPTY;let n=this.projects.belongsTo(e),r=[],i=new On.default,a=new On.default,o=new On.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return ph.writeId(t,i),o.set(i,a),a},u=(e,t)=>{let n;if(xu(e))n=$y(e.deploymentNode);else{let a=s.getName(e);if(!D(a))return[];n=Ha(a,t);let o=l(e,a,n);if(t?i.set(t,o):r.push(o),hl(e))return[]}let o=[];if(mt(e.body)){for(let t of e.body.elements)if(!Tl(t))try{o.push(...u(t,n))}catch(e){G(e)}}o=[...i.get(n)??[],...o];for(let e of o)a.set(n,e);if(xu(e))for(let e of Ki(n))for(let t of o)a.set(e,t);return a.get(n)??[]};for(let e of t)try{if(Tl(e))continue;u(e,null)}catch(e){G(e)}return new Mb(r,i,a,o,n)}};function Pb(e){let t=new Map;for(let n of e)if(ho(n)&&n.viewOf&&w(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=nn(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:Fb}=f;function Ib({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:xo(n)?{direction:n}:n,nodes:gn(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:gn(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function Lb(e){return e.includes(`@likec4-generated`)}function Rb(e){if(!Lb(e))throw Error(`Not a likec4-generated comment: ${e}`);return Ib(Er(Dr(e.trim().split(`
541
- `).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function zb(e){let t=ee(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!Lb(t.text)))try{return Rb(t.text)}catch(n){let r=Fb(e);G(n),W.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}var Bb=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=Rt([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=Rt([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=Rt([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:O(r,1)?r:null,links:O(n,1)?n:null,...!A(i)&&{metadata:i}}}},Vb=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new On.default(Set);constructor(e){let t={};for(let n of e){let{c4Specification:e,c4Globals:r,c4Imports:i}=n;Object.assign(t,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,r.predicates),Object.assign(this.globals.dynamicPredicates,r.dynamicPredicates),Object.assign(this.globals.styles,r.styles);for(let[e,t]of i)this.imports.set(e,t)}this.tags=Ni(t)}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];return u?(s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,a=a===zi(r)&&u.title?u.title:a,u.tags&&Ii(u.tags)&&(e=e?Rt([...u.tags,...e]):u.tags),B({metadata:l&&!A(l)?l:void 0,notation:u.notation,style:B({...u.style,...n}),links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})):(W.warn`No kind '${i}' found for ${r}`,null)}catch(e){G(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>bt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:V.flatten(e.element)};if(`element`in e)return W.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return W.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===zi(e.id)&&t.title?t.title:i,B({...t,...a,title:i,style:B({...t.style,...r}),id:n})}catch(e){G(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>bt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}};function Hb(e,t){let n=new Vb(t),r=gn(n.specs.colors,e=>Ea(e.color)),i=new Set,a=new Bb,o=new Bb,s=t.flatMap(e=>e.c4ExtendRelations),c=new Set,l=e=>{e?.metadata&&Et(e.metadata).forEach(e=>i.add(e))},u=T(t,Dt(e=>(a.merge(e.c4ExtendElements),C(e.c4Elements,n.toModelElement))),k(D),Yi,an((e,t)=>{let n=Ri(t.id);return n&&w(e[n])?(W.debug`No parent found for ${t.id}`,e):(e[t.id]=a.applyExtended(t),l(e[t.id]),e)},{})),d=T(t,Dt(e=>C(e.c4Relations,n.toModelRelation)),k(e=>{if(!e)return!1;let t=V.flatten(e.source),n=V.flatten(e.target);return w(u[t])&&!qa(t)||w(u[n])&&!qa(n)?(W.debug`Invalid relation ${e.id}
542
- source: ${t} resolved: ${!!u[t]}
543
- target: ${n} resolved: ${!!u[n]}\n`,!1):!0}),C(e=>{let t=ab(`extend-relation`,V.flatten(e.source),V.flatten(e.target),e.kind??`default`,e.title??``),n=s.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>c.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=Rt([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=Rt(r),l=i;return{...e,...O(o,1)&&{tags:o},...O(l,1)&&{links:l},...!A(a)&&{metadata:a}}}),It(l),jt(E(`id`))),f=T(t,Dt(e=>(o.merge(e.c4ExtendDeployments),C(e.c4Deployments,n.toDeploymentElement))),k(D),Yi,an((e,t)=>{let n=Ri(t.id);return n&&w(e[n])?(W.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=no(t)?o.applyExtended(t):t,l(e[t.id]),e)},{})),p=T(t,Dt(e=>C(e.c4DeploymentRelations,n.toDeploymentRelation)),k(e=>e?w(f[e.source.deployment])||w(f[e.target.deployment])?(W.debug`Invalid deployment relation ${e.id}
544
- source: ${e.source.deployment} resolved: ${!!f[e.source.deployment]}
545
- target: ${e.target.deployment} resolved: ${!!f[e.target.deployment]}\n`,!1):!0:!1),an((e,t)=>mt(e[t.id])?(W.debug`Duplicate deployment relation ${t.id}`,e):(l(t),e[t.id]=t,e),{}));function m(t){let n=t.uri.toString();return t=>{let{id:r,title:i,description:a,astPath:o,...s}=t;return t[Ra]===`element`&&w(i)&&`viewOf`in t&&(i=u[t.viewOf]?.title??null),w(i)&&r===`index`&&(i=`Landscape view`),{...kt(s,e=>e===void 0),[La]:`parsed`,sourcePath:se.relative(e.folderUri,n),docUri:n,description:a,title:i,id:r}}}let h=t.flatMap(e=>C(e.c4Views,m(e)));h.some(e=>e.id===`index`)||h.unshift({[La]:`parsed`,[Ra]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]});let g=T(h,jt(E(`id`)));h.some(go)&&(g=Uy(g));for(let e of s)c.has(e.astPath)||W.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[La]:`parsed`,projectId:e.id,project:B({id:e.id,title:e.config.title??e.config.name,styles:e.config.styles,manualLayouts:e.config.manualLayouts}),specification:{tags:n.tags,elements:n.specs.elements,relationships:gn(n.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:n.specs.deployments,...i.size>0&&{metadataKeys:[...i].sort(ji)},customColors:r},elements:u,relations:d,globals:n.globals,views:g,deployments:{elements:f,relations:p},imports:{}},imports:n.imports}}const Ub=e=>`parsed-without-imports-${e}`,Wb=e=>`parsed-model-${e}`,Gb=e=>`computed-model-${e}`,Kb=W.getChild(`model-builder`);var qb=class extends Zy{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;constructor(e){super(),this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)})),this.onDispose(this.DocumentBuilder.onBuildPhase(m.Validated,(e,t)=>{let n=e.flatMap(e=>Ps(e.uri)||this.projects.isExcluded(e)?[]:e.uri);n.length>0&&this.notifyListeners(n)})),Kb.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=Ub(e);return t.get(n,()=>{let t=Kb.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,Hb(n,r))}catch(t){return Kb.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=Kb.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);O(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=Kb.getChild(e),r=this.cache,i=cb();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Pe(t);let a=Wb(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,Mm.create(t)):(n.debug`parseModel: returning EMPTY`,Mm.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=!!t&&!A(t),i=Gb(e)+(r?`+manualLayouts`:``);return n.get(i,()=>{let n=Kb.getChild(e),i=this.unsafeSyncJoinedModelData(e);if(!i)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Mm.EMPTY.asComputed;let a=Mm.create(i),o=[];for(let e of cn(i.views)){let r=Hy(e,a);if(!r.isSuccess){n.warn(M(r.error));continue}t?.[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),o.push(r.view)}Pb(o);let s=At(o,t=>{let n=Jb(e,t.id),r=this.previousViews[n],i=r&&Yn(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),c={...i,[La]:`computed`,views:s};return r&&(c.manualLayouts=t),n.debug(`unsafeSyncComputeModel${r?` with manual layouts`:``}: completed`),Mm.create(c)})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=Kb.getChild(e),r=cb();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Pe(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Mm.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Ae.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Kb.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){Kb.warn(M(e))}}};function Jb(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:Yb,findNodeForProperty:Xb}=tt,{getDocument:Zb,streamAllContents:Qb}=f,$b=W.getChild(`ModelLocator`);var ex=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=pt(t)?this.projects.ensureProjectId():ib(t)),pt(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri);return i?this.parser.parse(i).c4Elements.find(t=>t.id===e)??null:null}let r=this.fqnIndex.getFqn(t);return this.parser.parse(Zb(t)).c4Elements.find(e=>e.id===r)??null}locateElement(e,t){let[n,r]=Ja(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!tf(r)&&!Tl(r))continue;let i=r.kind?Xb(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Xb(r.$cstNode,`dotKind`):void 0,i??=Yb(r.$cstNode,`->`),i??=Xb(r.$cstNode,`title`),i??=Xb(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(gc(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?Xb(r.$cstNode,`name`):void 0;return i??=Yb(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!mh(n))return[];n.state<m.Validated&&($b.debug(`Waiting for document ${n.uri.path} to be Validated`),await this.services.shared.workspace.DocumentBuilder.waitUntil(m.Validated,n.uri,t));let r=ib(n);$b.debug(`locate document tags for ${n.uri.path} in project ${r}`);try{let e=new Vb(this.documents(r).toArray()).tags;$b.debug(`Assigned colors to tags`,{tagSpecs:e});let t=T(Qb(n.parseResult.value),ta(e=>Gf(e)||qf(e)),L(),Dt(t=>{let n,r;try{Gf(t)?(n=t.name,r=t.$cstNode):(n=t.tag.$refText,r=t.tag.$refNode);let i=e[n];return P(i,`Tag ${n} not found in merged specification`),P(r,`Tag ${n} does not have a $cstNode`),{name:n,color:i.color,range:r.range,isSpecification:Gf(t)}}catch(e){return $b.warn(`Fail on tag ${n}`,{err:e}),[]}}));return $b.debug(`Found ${t.length} tags in document ${n.uri.path}`),t}catch(e){return $b.warn(M(e)),[]}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!zl(n)||!n.body)return $b.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!tc(i))return $b.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Xb(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Xb(i.$cstNode,`dotKind`):void 0,a??=Yb(i.$cstNode,`->`),a??=Yb(i.$cstNode,`<-`),a??=Xb(i.$cstNode,`title`),a??=Xb(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const tx=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);wt(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),W.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:nx}=f,rx=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;tx.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=ib(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},ix=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;tx.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=ib(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},ax=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=nx(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){W.warn(M(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(V.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(V.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(V.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(V.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Vi(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},ox=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!yl(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),sx=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=Qy(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=Qy(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},cx=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;Rp(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=Qy(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},lx=e=>Z((e,t)=>{if(A(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}pe(e,Vl)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:ux}=f,dx=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}tx.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=ux(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(ib(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},fx=e=>Z((e,t)=>{rb(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:px}=f,mx=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{let r=ib(px(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}})},hx=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),gx=e=>(e,t)=>{let n=e.$container;n.props.some(t=>ad(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),uu(n)&&eu(n.$container)&&n.$container.props.some(e=>ad(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},_x=e=>(e,t)=>{pe(e,tc)||t(`error`,`Notes can be defined only inside dynamic view`,{node:e})},vx=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||pt(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=Tt(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!Tt(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!Tt(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!Tt(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),Tt(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),pt(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)};let yx=null,bx=null;const xx=e=>e.map(e=>{let t=(e.c4Relations??[]).map(e=>ab(`extend-relation`,V.flatten(e.source),V.flatten(e.target),e.kind??`default`,e.title??``)).sort().join(`,`);return`${e.uri.toString()}:${t}`}).join(`|`),Sx=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(te(e)),i=ob(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=ob(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}V.isImportRef(i)&&(V.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Vi(V.flatten(i),V.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},Cx=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),wx=e=>{let t=e.likec4.ModelParser;return Z((n,r)=>{let i=t.forDocument(te(n)),a=ob(()=>i.parseFqnRef(n.source));if(!a){r(`error`,`Source not resolved`,{node:n,property:`source`});return}let o=ob(()=>i.parseFqnRef(n.target));if(!o){r(`error`,`Target not resolved`,{node:n,property:`target`});return}if(!V.isModelRef(a)&&!V.isImportRef(a)){r(`error`,`Source must reference a model element`,{node:n,property:`source`});return}if(!V.isModelRef(o)&&!V.isImportRef(o)){r(`error`,`Target must reference a model element`,{node:n,property:`target`});return}let s=(n.kind??n.dotKind?.kind)?.ref?.name??`default`,{title:c=``}=i.parseBaseProps({},{title:n.title}),l=ab(`extend-relation`,V.flatten(a),V.flatten(o),s,c),u=e.shared.workspace.LangiumDocuments.all.toArray().filter(hh),d=xx(u);if(d!==bx){let e=new Set;for(let t of u)for(let n of t.c4Relations??[]){let t=ab(`extend-relation`,V.flatten(n.source),V.flatten(n.target),n.kind??`default`,n.title??``);e.add(t)}yx=e,bx=d}(yx?.has(l)??!1)||r(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:n})})},Tx=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),Ex=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),Dx=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),Ox=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{tx.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=ib(e),i=t.projectElements(r,tu).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==te(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},kx=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{tx.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=ib(e),i=t.projectElements(r,Sl).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==te(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},Ax=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=ib(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==te(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},jx=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{tx.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=ib(e);t.projectElements(r,pf).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},Mx=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ib(e),i=t.projectElements(r,Uu),a=t.projectElements(r,Vu);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},Nx=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ib(e);t.projectElements(r,Zu).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Px=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ee(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Lb(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;tx.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=ib(e);t.projectElements(i,hc).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function Fx(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const Ix=e=>Z((e,t)=>{let n=Fx(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(Bu),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!Lx(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function Lx(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:Lx(e.parent,t.parent)}const Rx=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=Th(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(te(r)),o=H.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case H.isWildcard(o)&&i:case H.isElementKindExpr(o)&&i:case H.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case H.isWildcard(o):case H.isModelRef(o):case H.isDeploymentRef(o):return;case H.isElementKindExpr(o):case H.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},zx=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(te(e)).parseFqnRefExpr(e),i=Th(e),a=Ah(e)&&!pe(e,e=>Fl(e)||fp(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!pe(e,Cc)){if(H.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(H.isDeploymentRef(r)&&V.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}D(e.selector)&&!yl(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case H.isElementKindExpr(r):case H.isElementTagExpr(r):case H.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},Bx=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!hd(e.$container)&&w(me(e,mu)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),Vx=e=>Z((e,t)=>{if(Th(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=me(e,mu);n&&w(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),Hx=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=me(e,Nl);if(!r||r.isInclude!==!0)return;let i=te(e),a=t.forDocument(i),o=Qa.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Qa.isDirect(o)){(H.isModelRef(o.source)||H.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Qa.isIncoming(o)?o.incoming:Qa.isOutgoing(o)?o.outgoing:o.inout,H.isModelRef(c)){n(`error`,s,{node:e});return}})},Ux=e=>Z((e,t)=>{let n=Th(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var Wx=class extends Ye{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};Xe();function Gx(e){return t=>e.some(e=>e(t))}const Kx=Gx([dd,ld,Ku,Wu,Hu,Ju,Xu,Iu,cf,lc,Cc,Yl,Ip,Rp,Xs,Nl,ac,Cc,Bu,Rc,Ic,Yf,Bc,$s,gc,Hc,hl,yl,Tl,Ac,Ul,vc,tf,rc,Pc,Ud,Ql,ou,Tu,xu,ku,Af,Pf,Of,Bf,Ef,Rf,Gs]),qx=e=>{let t=e;for(;t&&!yd(t);){if(Kx(t))return t;t=t.$container}};function Jx(e){let t=e.state>=m.Validated?e.diagnostics?.filter(e=>e.severity===ze.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(w(e)||n.has(e))continue;n.add(e);let t=qx(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function Yx(e){W.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:ix(e),DeploymentNodeKind:kx(e),DeploymentNode:rx(e),DeploymentRelation:ax(e),ExtendDeployment:ox(e),ExtendRelation:wx(e),FqnRefExpr:zx(e),RelationExpr:Hx(e),NotesProperty:_x(e),OpacityProperty:hx(e),IconProperty:gx(e),SpecificationRule:Tx(e),Model:Ex(e),Globals:Dx(e),GlobalPredicateGroup:Mx(e),GlobalDynamicPredicateGroup:Mx(e),GlobalStyleId:Nx(e),DynamicStepSingle:sx(e),DynamicStepChain:cx(e),LikeC4View:Px(e),Element:dx(e),ElementRef:fx(e),ElementKind:Ox(e),Relation:Sx(e),RelationBody:Cx(e),Tag:Ax(e),FqnExprWith:Rx(e),RelationExprWith:Ux(e),RelationshipKind:jx(e),IncomingRelationExpr:Bx(e),OutgoingRelationExpr:Vx(e),ImportsFromPoject:mx(e),ColorLiteral:vx(e),DynamicViewDisplayVariantProperty:lx(e),ViewRuleRank:Ix(e)});let t=e.shared.lsp.Connection;t&&ma(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)W.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>W.error(M(e)))})})}const Xx=W.getChild(`BaseParser`);function Zx(e){if(e==null)return;let t=Qx(e);return pt(t)?t.split(`
1211
+ }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:v.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Pe.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=wt(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:v.Folder,insertText:n,filterText:n,textEdit:Ze.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},Cx=Oe(),wx=class extends Ie{createDocumentHighlight(e){return Cx.DocumentHighlight.create(e.segment.range,Cx.DocumentHighlightKind.Read)}},Tx=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!$m(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:ee(e.parseResult.value).filter(tf).map(t=>{try{let n=de(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Sr(r))return{range:n,target:r}}catch(e){G(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Sr(t)||br(t))return t;if(vr(t))return hr(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return hr(n.toString(),t)}relativeLink(e,t){if(br(t))return yr(t);if(vr(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return yr(gr(new URL(t,r).toString(),n))}return null}};De();const Ex=W.getChild(`DocumentSymbolProvider`);var Dx=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!$m(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<_.Linked&&(Ex.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,e.uri,n),Ex.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return G(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(b);return n.length===0?[]:[{kind:Le.Namespace,name:`icons`,range:t.range,selectionRange:ae(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=de(t,`name`);if(!n)return[];let r=w([...e.elements,...e.tags,...e.relationships],x(e=>{try{if(op(e)||up(e)||ip(e))return this.getKindSymbol(e);if(gp(e))return this.getTagSymbol(e)}catch(e){return G(e),null}F(e)}),D(b));return r.length===0?[]:[{kind:Le.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=de(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>id(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=de(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(ed(e))return this.getExtendElementSymbol(e);if(Du(e))return this.getElementSymbol(e)}catch(e){G(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:lx(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=de(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=de(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||wt(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||wt(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||wt(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?de(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(Jl(e))return this.getDeploymentNodeSymbol(e);if(Wl(e))return this.getDeployedInstanceSymbol(e);if(Xu(e))return[]}catch(e){G(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=me(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Ox=`
1212
+ ---
1213
+ `;var kx=class extends we{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(xp(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(ju(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(Ql(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Wf(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(Du(e))return this.getElementHover(e);if(Jl(e))return this.getDeploymentNodeHover(e);if(Wl(e))return this.getDeployedInstanceHover(e)}catch(e){W.debug(ci(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=Xa(n);i&&r.push(``,(i.md??i.txt).split(`
1214
+ `).join(`
1215
+ `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
1216
+ <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
1217
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Ox,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=g.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(Ox,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(Mt);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:Ox,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
1218
+ `):void 0}getDeploymentNodeHover(e){let t=me(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=Xa(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
1219
+ `)}}}getDeployedInstanceHover(e){let t=me(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=V.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${V.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
1220
+ `)}}}},Ax=Ye(),jx=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:Ax.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[Ax.TextEdit.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};De();const Mx=W.getChild(`SemanticTokenProvider`),Nx={...Te},Px={...qe};function Fx(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Px)return t.push(Px[i]),n;if(i in Nx)return()=>e(Nx[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Ix=`Stop Highlighting`,Lx=()=>{throw Ix};var Rx=class extends Ke{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(Wf,e=>{e.property(`name`).function()}),e(na(Mf,Of,eu),e=>{e.property(`kind`).function()}),e(qd,e=>{e.property(`name`).definition.function(),Lx()}),e(na(bf,Hf),e=>{e.property(`value`).readonly.definition.interface(),Lx()}),e(um,e=>{e.cst().readonly.definition.variable(),Lx()}),e(gd,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Cp,e=>{e.cst().type(),Lx()}),e(Bf,e=>{e.cst().function(),Lx()}),e(em,e=>{b(e.node.value)&&e.property(`value`).function()}),e(na(yl,El),e=>{b(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(na(im,om),e=>{e.property(`participant`).keyword()}),e(Nu,e=>{b(e.node.kind)&&e.property(`kind`).definition.type()}),e(na(Ed,wd),e=>{e.property(`id`).readonly.definition.variable()}),e(Pp,e=>{e.property(`style`).readonly.definition.variable()}),e(na(bd,vd),e=>{e.property(`name`).readonly.definition.variable()}),e(Mp,e=>{e.property(`predicate`).readonly.definition.variable()}),e(Vu,e=>{b(e.node.tag)&&e.property(`tag`).definition.type()}),e(na(md,bp),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.$cstNode?.text;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable(),Lx()}),e(vp,e=>{e.node.parent?e.property(`el`).property():(e.property(`el`).readonly.definition.variable(),Lx())}),e(np,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(gp,e=>{b(e.node.color)&&e.keyword(`color`).property()}),e(na(op,up,ip),e=>{e.property(`kind`).readonly.declaration.type()}),e(xp,e=>{e.property(`name`).definition.type()}),e(Ef,e=>{e.property(`value`).number()}),e(Fd,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(tf,e=>{b(e.node.value)&&e.property(`value`).string()}),e(Ll,e=>{b(e.node.customColor)&&e.property(`customColor`).enum(),b(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(jd,e=>{b(e.node.customColor)&&e.property(`customColor`).enum(),b(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(na(Qf,Nl,$d,Fl,sl,Nd,vu),e=>{b(e.node.value)&&e.property(`value`).enum()})}async semanticHighlight(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlight(e,t,n)}async semanticHighlightRange(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlightRange(e,t,n)}async semanticHighlightDelta(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlightDelta(e,t,n)}async ensureState(e,t){e.state<_.Linked&&(Mx.debug`waiting for document ${e.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,e.uri,t),Mx.debug`document ${e.uri.path} is ${`Linked`}`)}highlightElement(e,t){if(na(Du,Jl,Wl)(e))return this.highlightNameAndKind(e);if(Gc(e))return this.highlightView(e);vc(e)&&!na(qc,zu,Jf)(e)&&b(e.key)&&t({node:e,property:`key`,type:Te.property});let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Ix)return`prune`;Mx.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Wl(e)||this.mark(e).property(`kind`).keyword(),Du(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>Fx((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>Fx((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>Fx((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const zx=na(Du,ed);var Bx=class extends sx{projects;langiumDocuments;documentCache;workspaceCache;logger=W.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new Rn.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Ce(e.shared,_.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(_.IndexedContent,e=>{$m(e)&&lc(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=_.IndexedContent)}get(e){return e.state<_.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:le.basename(e.uri),state:e.state,expect:_.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){P(Du(e)||Sc(e));let t=Qm.readId(e);if(b(t))return t;let n=me(e);return n.state<_.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:le.basename(n.uri)}),P($m(n)),this.get(n),N(Qm.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return re(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return re(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new In.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return Vx(t)}))}directChildrenOf(e,t){return re(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new In.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return Vx(n)}))}uniqueDescedants(e,t){return re(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new In.default,r=new In.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=Vx(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,..._a(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(zx));if(t.length===0)return Hx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new In.default,a=new In.default,o=new In.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Qm.writeId(t,i),o.set(i,a),a};function l(e,t){let n=co(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=D(e.body?.elements??[],zx);if(!E(s,1))return[o];let u=s.flatMap(e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=lx(e.element),n=w(e.body?.elements??[],D(Du),C(e=>l(e,t)));if(n.length!==0)for(let e of[t,...da(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(ed(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:le.basename(e.uri),error:t})}return new Hx(r,i,a,o,n)}};function Vx(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Xi(e.name,t.name))}var Hx=class e{static EMPTY=new e([],new In.default,new In.default,new In.default,Fh.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Ux=na(Sc,Xu);var Wx=class extends Bx{Names;logger=W.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Ux));if(t.length===0)return Hx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new In.default,a=new In.default,o=new In.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Qm.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!b(n))return[];let o=co(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),Wl(e))return[c];let d=D(e.body?.elements??[],Ux);if(!E(d,1))return[c];let f=d.flatMap(e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=lx(e.deploymentNode),n=w(e.body?.elements??[],D(Ux),C(e=>u(e,t)));if(n.length!==0)for(let e of[t,...da(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Xu(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:le.basename(e.uri),error:t})}return new Hx(r,i,a,o,n)}};const Gx=/^(aws|azure|gcp|tech):(.+)$/;function Kx(e){if(!e)return;let t=Gx.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var qx=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new In.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;Mt(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Qi(n),this.projectId=On(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return W.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,An(a)&&(a=u.title||ia(r)),u.tags&&ta(u.tags)&&(e=e?qt([...u.tags,...e]):u.tags);let d=B({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=Kx(d.icon)),B({metadata:l&&!wt(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){G(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Mt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:V.flatten(e.element)};if(`element`in e)return W.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return W.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===ia(e.id)&&t.title?t.title:i,B({...t,...a,title:i,style:B({...t.style,...r}),id:n})}catch(e){G(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Mt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},Jx=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function Yx(e){let t=new Map;for(let n of e)if(Fo(n)&&n.viewOf&&S(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=mn(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:Xx}=he;function Zx({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:Vo(n)?{direction:n}:n,nodes:zt(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:zt(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function Qx(e){return e.includes(`@likec4-generated`)}function $x(e){if(!Qx(e))throw Error(`Not a likec4-generated comment: ${e}`);return Zx(Hr(Ur(e.trim().split(`
1221
+ `).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function eS(e){let t=ie(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!Qx(t.text)))try{return $x(t.text)}catch(n){let r=Xx(e);G(n),W.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}var tS=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=qt([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=qt([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=qt([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:E(r,1)?r:null,links:E(n,1)?n:null,...!wt(i)&&{metadata:i}}}};function nS(e,t,n){let r=new qx(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=zt(r.specs.colors,e=>Ga(e.color)),a=new Set,o=new tS,s=new tS,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&cn(e.metadata).forEach(e=>a.add(e))},d=w(n,C(e=>(o.merge(e.c4ExtendElements),x(e.c4Elements,r.toModelElement))),D(b),ga,gn((e,t)=>{let n=ra(t.id);return n&&S(e[n])?(W.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=w(n,C(e=>x(e.c4Relations,r.toModelRelation)),D(e=>{if(!e)return!1;let t=V.flatten(e.source),n=V.flatten(e.target);return S(d[t])&&!mo(t)||S(d[n])&&!mo(n)?(W.debug`Invalid relation ${e.id}
1222
+ source: ${t} resolved: ${!!d[t]}
1223
+ target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),x(e=>{let t=hx(`extend-relation`,V.flatten(e.source),V.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=qt([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=qt(r),s=i;return{...e,...E(o,1)&&{tags:o},...E(s,1)&&{links:s},...!wt(a)&&{metadata:a}}}),Gt(u),Ht(T(`id`))),p=w(n,C(e=>(s.merge(e.c4ExtendDeployments),x(e.c4Deployments,r.toDeploymentElement))),D(b),ga,gn((e,t)=>{let n=ra(t.id);return n&&S(e[n])?(W.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=Co(t)?s.applyExtended(t):t,u(e[t.id]),e)},{})),m=w(n,C(e=>x(e.c4DeploymentRelations,r.toDeploymentRelation)),D(e=>e?S(p[e.source.deployment])||S(p[e.target.deployment])?(W.debug`Invalid deployment relation ${e.id}
1224
+ source: ${e.source.deployment} resolved: ${!!p[e.source.deployment]}
1225
+ target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),gn((e,t)=>Vt(e[t.id])?(W.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[ro]===`element`&&S(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),S(i)&&r===`index`&&(i=`Landscape view`),{...Tt(s,e=>e===void 0),[no]:`parsed`,sourcePath:le.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>x(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[no]:`parsed`,[ro]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews!==!1){let e=new Set;for(let t of g)t[ro]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of cn(d)){if(e.has(n)||mo(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[no]:`parsed`,[ro]:`element`,id:r,viewOf:n,title:`Auto / ${d[n]?.title??n}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=w(g,Ht(T(`id`)));g.some(Io)&&(ee=Qb(ee));for(let e of c)l.has(e.astPath)||W.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[no]:`parsed`,projectId:t.id,project:B({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:zt(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Xi)},customColors:i},elements:d,relations:f,globals:r.globals,views:ee,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const rS=e=>`parsed-without-imports-${e}`,iS=e=>`parsed-model-${e}`,aS=e=>`computed-model-${e}`,oS=W.getChild(`builder`);var sS=class extends sx{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let t=Kt(Dt(),D(e=>lc(e)&&!this.projects.isExcluded(e)),x(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(_.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),oS.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=rS(e);return t.get(n,()=>{let t=oS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,nS(this.services,n,r))}catch(t){return oS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=oS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);E(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=oS.getChild(e),r=this.cache,i=vx();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await d(t);let a=iS(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,gg.create(t)):(n.debug`parseModel: returning EMPTY`,gg.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=aS(e)+(t?.hash??``);return n.get(r,()=>{let n=oS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,gg.EMPTY.asComputed;let i=gg.create(r),a=[];for(let e of yn(r.views)){let r=Zb(e,i);if(!r.isSuccess){n.warn(ci(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}Yx(a);let o=Et(a,t=>{let n=cS(e,t.id),r=this.previousViews[n],i=r&&Dr(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[no]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(gg.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=oS.getChild(e),r=vx();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await d(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===gg.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Me.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){oS.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){oS.warn(ci(e))}}};function cS(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:lS,findNodeForProperty:uS}=f,{getDocument:dS,streamAllContents:fS}=he,pS=W.getChild(`locator`);var mS=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=sn(t)?this.projects.ensureProjectId():mx(t)),sn(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=dS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return pS.debug(ci(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=ho(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Mf(r)&&!eu(r))continue;let i=r.kind?uS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?uS(r.$cstNode,`dotKind`):void 0,i??=lS(r.$cstNode,`->`),i??=uS(r.$cstNode,`title`),i??=uS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Gc(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?uS(r.$cstNode,`name`):void 0;return i??=lS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<_.Linked&&(pS.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,n.uri,t));let r=mx(n);pS.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??$o.DEFAULT;if(!e)return pS.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=w(fS(n.parseResult.value),ba(e=>xp(e)||Cp(e)),L(),C(n=>{let r,i;try{xp(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return P(a,`Tag ${r} not found in merged specification`),P(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:xp(n)}}catch(e){return pS.warn(`Fail on tag ${r}`,{err:e}),[]}}));return pS.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return pS.warn(ci(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!mu(n)||!n.body)return pS.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!Ac(i))return pS.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?uS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?uS(i.$cstNode,`dotKind`):void 0,a??=lS(i.$cstNode,`->`),a??=lS(i.$cstNode,`<-`),a??=uS(i.$cstNode,`title`),a??=uS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const hS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);Pt(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),W.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:gS}=he,_S=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;hS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=mx(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},vS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;hS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=mx(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},yS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=gS(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){W.warn(ci(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(V.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(V.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(V.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(V.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}oa(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},bS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!Jl(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),xS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=cx(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=cx(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},SS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;mm(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=cx(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},CS=e=>Z((e,t)=>{if(wt(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}ge(e,gu)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:wS}=he,TS=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}hS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=wS(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(mx(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},ES=e=>Z((e,t)=>{px(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:DS}=he,OS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=mx(DS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},kS=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),AS=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Fd(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),zu(n)&&ku(n.$container)&&n.$container.props.some(e=>Fd(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},jS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||sn(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=It(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!It(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!It(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!It(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),It(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),sn(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)},MS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(me(e)),i=gx(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=gx(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}V.isImportRef(i)&&(V.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),oa(V.flatten(i),V.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},NS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),PS=e=>{let t=e.likec4.ModelParser,n=new Ce(e.shared,_.Linked),r=({source:e,target:t,kind:n,title:r})=>hx(`extend-relation`,V.flatten(e),V.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(w(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),C(e=>e.c4Relations??[]),x(e=>r(e)))))}return Z((e,n)=>{let a=me(e),o=t.forDocument(a),s=gx(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=gx(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!V.isModelRef(s)&&!V.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!V.isModelRef(c)&&!V.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=mx(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},FS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),IS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),LS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),RS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e),i=t.projectElements(r,Au).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==me(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},zS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e),i=t.projectElements(r,Zl).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==me(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},BS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=mx(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==me(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},VS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e);t.projectElements(r,Uf).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},HS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=mx(e),i=t.projectElements(r,yd),a=t.projectElements(r,_d);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},US=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=mx(e);t.projectElements(r,Dd).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},WS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ie(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Qx(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=mx(e);t.projectElements(i,Wc).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function GS(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const KS=e=>Z((e,t)=>{let n=GS(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(gd),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!qS(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function qS(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:qS(e.parent,t.parent)}const JS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=lh(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(me(r)),o=H.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case H.isWildcard(o)&&i:case H.isElementKindExpr(o)&&i:case H.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case H.isWildcard(o):case H.isModelRef(o):case H.isDeploymentRef(o):return;case H.isElementKindExpr(o):case H.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},YS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(me(e)).parseFqnRefExpr(e),i=lh(e),a=mh(e)&&!ge(e,e=>uu(e)||Hp(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!ge(e,Qc)){if(H.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(H.isDeploymentRef(r)&&V.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}b(e.selector)&&!Jl(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case H.isElementKindExpr(r):case H.isElementTagExpr(r):case H.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},XS=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!Gd(e.$container)&&S(te(e,Uu)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),ZS=e=>Z((e,t)=>{if(lh(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=te(e,Uu);n&&S(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),QS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=te(e,cu);if(!r||r.isInclude!==!0)return;let i=me(e),a=t.forDocument(i),o=yo.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(yo.isDirect(o)){(H.isModelRef(o.source)||H.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=yo.isIncoming(o)?o.incoming:yo.isOutgoing(o)?o.outgoing:o.inout,H.isModelRef(c)){n(`error`,s,{node:e});return}})},$S=e=>Z((e,t)=>{let n=lh(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var eC=class extends Xe{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};De();const tC=na(Vd,zd,Sd,bd,vd,wd,Ed,fd,Rf,Rc,Qc,wu,fm,mm,Tc,cu,Pc,Qc,gd,pl,dl,Tp,hl,Oc,Gc,_l,Wl,Jl,eu,al,vu,uf,qc,Mf,Pf,Mc,ll,bf,Du,ku,zu,Fu,ed,nd,Xu,Qu,id,od,op,up,ip,gp,np,mp,Ju,bc),nC=e=>{let t=e;for(;t&&!Yd(t);){if(tC(t))return t;t=t.$container}};function rC(e){let t=e.state>=_.Validated?e.diagnostics?.filter(e=>e.severity===Ge.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(S(e)||n.has(e))continue;n.add(e);let t=nC(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function iC(e){W.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:vS(e),DeploymentNodeKind:zS(e),DeploymentNode:_S(e),DeploymentRelation:yS(e),ExtendDeployment:bS(e),ExtendRelation:PS(e),FqnRefExpr:YS(e),RelationExpr:QS(e),OpacityProperty:kS(e),IconProperty:AS(e),SpecificationRule:FS(e),Model:IS(e),Globals:LS(e),GlobalPredicateGroup:HS(e),GlobalDynamicPredicateGroup:HS(e),GlobalStyleId:US(e),DynamicStepSingle:xS(e),DynamicStepChain:SS(e),LikeC4View:WS(e),Element:TS(e),ElementRef:ES(e),ElementKind:RS(e),Relation:MS(e),RelationBody:NS(e),Tag:BS(e),FqnExprWith:JS(e),RelationExprWith:$S(e),RelationshipKind:VS(e),IncomingRelationExpr:XS(e),OutgoingRelationExpr:ZS(e),ImportsFromPoject:OS(e),ColorLiteral:jS(e),DynamicViewDisplayVariantProperty:CS(e),ViewRuleRank:KS(e)});let t=e.shared.lsp.Connection;t&&Na(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)W.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>W.error(ci(e)))})})}const aC=W.getChild(`parser`);function oC(e){if(e==null)return;let t=sC(e);return sn(t)?t.split(`
546
1226
  `).join(` `):`md`in t?{md:t.md.split(`
547
1227
  `).join(` `)}:{txt:t.txt.split(`
548
- `).join(` `)}}function Qx(e){if(e!=null)switch(!0){case pt(e):return Or(e).trim();case Dd(e)&&D(e.markdown):return{md:Or(e.markdown).trim()};case Dd(e)&&D(e.text):return{txt:Or(e.text).trim()};default:return}}var $x=class{isValid;constructor(e,t){this.services=e,this.doc=t,this.isValid=Jx(t).isValid}get project(){return R(this,`project`,()=>this.services.shared.workspace.ProjectsManager.getProject(this.doc))}resolveFqn(e){if(ld(e)){let t=ib(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Ka(t,n)}return Tu(e)?$y(e.element):xu(e)?$y(e.deploymentNode):qs(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||A(e.props))return;let t=e=>{if(Dd(e)){let t=Qx(e);if(!t)return[];if(typeof t==`string`)return D(t)?[t]:[];{let e=t.md||t.txt;return D(e)?[e]:[]}}else if(kd(e))return e.values.map(e=>Qx(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(D);return[]},n=T(e.props,Dt(e=>t(e.value).map(t=>[e.key,t])),k(([e,t])=>D(t)));if(A(n))return;let r=T(n,sn(([e])=>e),gn(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return A(i)?void 0:i}parseMarkdownOrString(e){if(Dd(e))return Qx(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;){try{if(this.isValid(t)){let e=t.values.map(e=>e.tag.ref?.name).filter(D);e.length>0&&n.push(...e)}}catch{}t=t.prev}return Ii(n)?Rt(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!(!e?.props||e.props.length===0))return T(e.props,k(Td),Dt(e=>{if(!this.isValid(e))return[];let t=e.value;if(D(t)){let n=D(e.title)?Zx(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return{url:t,...n&&{title:n},...r&&r!==t&&{relative:r}}}return[]}))}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let e=t.ref?.name;if(!e){Xx.warn(`Library icon ${t.$refText} is not a valid library icon`);return}return e}case n&&n===`none`:return n;case n&&ir(n):if(n.startsWith(`file:`)){Xx.warn(`Icon property '${n}' used the 'file' protocol which is not supported`);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&er(n):return Xn(this.doc.uri.toString(),`../`,n);case n&&nr(n):return rr(this.project.folderUri.toString(),n);default:Xx.warn(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){Xx.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?rr(i,r):i;return rr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if($u(e))return`#${e.hex}`;if(bf(e)){let t=Tt(e.alpha)?e.alpha:void 0;return pt(e.alpha)&&(t=_h(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(yt(e)){let t=this.parseStyleProps(e.find(uu)?.props);try{let n=this.parseIconProperty(e.find(ad));n&&(t.icon=n)}catch(e){Xx.warn(`Failed to parse icon property on element`,{err:e})}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case ol(n):D(n.value)&&(t.border=n.value);break;case cl(n):{let e=Sh(n);D(e)&&(t.color=e);break}case Sf(n):D(n.value)&&(t.shape=n.value);break;case ad(n):{let e=this.parseIconProperty(n);D(e)&&(t.icon=e);break}case td(n):{let e=Sh(n);D(e)&&(t.iconColor=e);break}case sd(n):D(n.value)&&(t.iconSize=yh(n));break;case rd(n):D(n.value)&&(t.iconPosition=bh(n));break;case Yd(n):t.opacity=vh(n);break;case Vd(n):t.multiple=Mt(n.value)?n.value:!1;break;case wf(n):D(n.value)&&(t.size=yh(n));break;case $d(n):D(n.value)&&(t.padding=yh(n));break;case Zf(n):D(n.value)&&(t.textSize=yh(n));break;default:F(n)}}catch(e){Xx.warn(`Failed to parse style property`,{err:e})}return B(t)}parseBaseProps(e,t){let n=Qx(t?.title??gh(e.title)),r=t?.description?{txt:Qx(t.description)}:this.parseMarkdownOrString(e.description);return B({title:n,summary:t?.summary?{txt:Qx(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:Zx(t?.technology)??Qx(gh(e.technology))})}};const eS=W.getChild(`DeploymentModelParser`);function*tS(e){let t=En.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Tl(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function nS(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of tS(e))try{switch(!0){case Tl(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case hl(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case yl(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case xu(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){eS.warn(M(e))}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.convertTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(vc)),s=T(e.body?.props??[],k(t),k(cu),At(e=>[e.key,e.value])),{title:c,...l}=this.parseBaseProps(s,{title:e.title,summary:e.summary}),u=this.convertLinks(e.body);return B({id:n,kind:r,title:c??zi(n),...l,tags:i??void 0,...u&&Ii(u)&&{links:u},style:a,metadata:o})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.convertTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(vc)),s=T(e.body?.props??[],k(t),k(cu),At(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary}),l=this.convertLinks(e.body);return B({id:n,element:r,tags:i??void 0,...l&&Ii(l)&&{links:l},...c,style:a,metadata:o})}parseExtendDeployment(e){if(!this.isValid(e))return null;let t=this.resolveFqn(e),n=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(vc)),i=this.getAstNodePath(e),a=this.parseLinks(e.body)??[];return!n&&A(r??{})&&A(a)?null:{id:t,astPath:i,...r&&{metadata:r},tags:n,links:Ii(a)?a:null}}_resolveDeploymentRelationSource(e){if(mt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(V.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(V.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body),o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(vc)),l=T(e.body?.props??[],k(gf),k(e=>D(e.value)),At(e=>[e.key,e.value])),u=T(e.body?.props??[],k(ff),Wt())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(vf);return B({id:ab(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a??void 0,...Ii(o)&&{links:o},...xh(f?.props,t),navigateTo:u,astPath:n})}}}function rS(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+ab(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(T(n,k(mp),At(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);fh.writeId(e,i);let l=zb(e);return{[Ra]:`deployment`,id:i,astPath:r,title:Zx(a)??null,description:o,tags:s,links:Ii(c)?c:null,rules:t.rules.flatMap(e=>{try{return this.isValid(e)?this.parseDeploymentViewRule(e):[]}catch(e){return G(e),[]}}),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(Nl(e))return this.parseDeploymentViewRulePredicate(e);if(ep(e))return Ch(e);if(Fl(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;bt(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){G(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(Ic)),n=Qx(gh(e.props.find(Gd)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const iS=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function aS(e){return!Op(e)&&!Ap(e)?null:e.participant}function oS(e){switch(!0){case tl(e):{let t=e.value.tag.ref?.name,n=aS(e);P(t,`Expected tag name`);let r={tag:iS(e,t)};return n?{participant:n,operator:r}:r}case Yc(e):{let t=e.value?.ref?.name,n=aS(e);P(t,`Expected kind name`);let r={kind:iS(e,t)};return n?{participant:n,operator:r}:r}case bp(e)||Ep(e):return{not:oS(e.value)};case gp(e):{let t=oS(e.left),n=oS(e.right);return sS(e.operator.toLowerCase(),t,n)}default:F(e)}}function sS(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[co(t)?t.and:t,co(n)?n.and:n].flat();return P(Ii(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[lo(t)?t.or:t,lo(n)?n.or:n].flat();return P(Ii(e),`Expected non-empty array`),{or:e}}default:F(e)}}const cS=W.getChild(`ExpressionV2Parser`),lS=e=>{let t=e.$cstNode,n=t?`:${t.range.start.line+1}:${t.range.start.character+1}`:``;return`${te(e).uri.fsPath}${n}`};function uS(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`FqnRef "${e.$cstNode?.text}" is empty at ${lS(e)}`);if(ld(t)){let e={project:ib(t),model:this.resolveFqn(N(t.imported.ref,`FqnRef is empty of imported: ${t.$cstNode?.text}`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Ql(t)){let n=nb(e);if(n){let e={project:ib(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=tb(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(qs(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(pc(e))return this.parseFqnExprOrWith(e);if(Dc(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(Iu(e))return this.parseFqnExprWith(e);if(dc(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(Ud(t)){let n=t.value.view.$refText;return D(n)&&(e.custom.navigateTo=n),e}if(cu(t)){if(mt(t.value)&&t.key!==`summary`)if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);n&&(e.custom.description=n)}else e.custom[t.key]=Qx(gh(t.value))||``;return e}if(ad(t)){let n=this.parseIconProperty(t);return mt(n)&&(e.custom[t.key]=n),e}if(cl(t)){let n=Sh(t);return mt(n)&&(e.custom[t.key]=n),e}if(Sf(t)||ol(t))return mt(t.value)&&(e.custom[t.key]=t.value),e;if(Yd(t))return mt(t.value)&&(e.custom[t.key]=vh(t)),e;if(td(t)){let n=Sh(t);return mt(n)&&(e.custom[t.key]=n),e}if(Gd(t)){let n=D(t.value)?Qx(gh(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(Vd(t))return Mt(t.value)&&(e.custom[t.key]=t.value),e;if(wf(t)||Zf(t)||$d(t)||sd(t))return D(t.value)&&(e.custom[t.key]=yh(t)),e;if(rd(t))return D(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(Pu(e))return this.parseFqnExprWhere(e);if(lc(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!Pu(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?oS(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(Pp(e))return{wildcard:!0};if(iu(e))return P(e.kind?.ref,`ElementKindExpr kind is not resolved: `+e.$cstNode?.text),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(fu(e))return P(e.tag.tag.ref,`ElementTagExpr tag is not resolved: `+e.$cstNode?.text),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(Bu(e))return this.parseFqnRefExpr(e);F(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{bt(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){cS.warn(M(e))}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(cf(e))return this.parseRelationExprWith(e);if(Tc(e))return this.parseRelationExprOrWhere(e);F(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(gf(t)||Gd(t)||qd(t)){let n=D(t.value)?Qx(gh(t.value)):void 0;return n&&(e[t.key]=n),e}if(il(t))return D(t.value)&&(e[t.key]=t.value),e;if(cl(t)){let n=Sh(t);return D(n)&&(e[t.key]=n),e}if(Cd(t))return D(t.value)&&(e[t.key]=t.value),e;if(ff(t)){let n=t.value.view.ref?.name;return D(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(of(e))return this.parseRelationExprWhere(e);if(Cc(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!of(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?oS(e.where):null,a;return a=i&&r?sS(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:F(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?(P(t.ref,`Kind is not resolved: `+e.$cstNode?.text),{kind:{eq:t.ref?.name}}):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}const dS=W.getChild(`GlobalsParser`);function fS(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!D(n))continue;if(n in t.predicates){dS.warn(`Global predicate named "${n}" is already defined`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(e){dS.warn(M(e))}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!D(n))continue;if(n in t.styles){dS.warn(`Global style named "${n}" is already defined`);continue}let r=this.parseGlobalStyleOrGroup(e);O(r,1)&&(t.styles[n]=r)}catch(e){dS.warn(M(e))}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Wu(e)){let r=this.parseGlobalPredicateGroup(e);O(r,1)&&(n.predicates[t]=r);return}if(Hu(e)){let r=this.parseGlobalDynamicPredicateGroup(e);O(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Ju(e))return[this.parseViewRuleStyle(e)];if(Xu(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}const pS=W.getChild(`ImportsParser`);function mS(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){pS.warn(M(e))}n=n.prev}}}}}const hS=W.getChild(`ModelParser`);function*gS(e){let t=En.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(tf(r)){n.push(r);continue}if(ku(r)){yield r;continue}if(r.body&&`elements`in r.body&&r.body.elements&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function _S(e){return class extends e{parseModel(){let e=this.doc;for(let t of gS(e))try{if(Ql(t)){e.c4Elements.push(this.parseElement(t));continue}if(tf(t)){this.isValid(t)&&e.c4Relations.push(this.parseRelation(t));continue}if(Tu(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(ku(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(n){let r=this.getAstNodePath(t),i=M(n),a=n instanceof Error?n.message:String(i);hS.warn(`Error on {eltype}: ${a}\n document: {path}\n astpath: {astPath}\n${i}`,{path:e.uri.path,eltype:t.$type,astPath:r})}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(vc)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=T(e.body?.props??[],k(t),k(cu),At(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u}),m=this.parseLinks(e.body);return B({id:n,kind:r,astPath:s,title:f??e.name,metadata:o,tags:i??void 0,...m&&Ii(m)&&{links:m},...p,style:a})}parseExtendElement(e){let t=this.resolveFqn(e),n=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(vc)),i=this.getAstNodePath(e),a=this.parseLinks(e.body)??[];return!n&&A(r??{})&&A(a)?null:B({id:t,astPath:i,metadata:r,tags:n,links:Ii(a)?a:null})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(V.isModelRef(t)||V.isImportRef(t),`Source must be a model reference`),P(V.isModelRef(n)||V.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(vc)),a=this.getAstNodePath(e),o=this.parseLinks(e.body)??[];if(!r&&A(i??{})&&A(o))return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return B({id:ab(`extend-relation`,V.flatten(t),V.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:Ii(o)?o:null})}_resolveRelationSource(e){if(mt(e.source)){let t=this.parseFqnRef(e.source);return P(V.isModelRef(t)||V.isImportRef(t),`Relation source must be a model reference`),t}if(eu(e.$container)||Du(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body),a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(vc)),c=this.getAstNodePath(e),l=T(e.body?.props??[],k(gf),k(e=>D(e.value)),At(e=>[e.key,e.value])),u=T(e.body?.props??[],k(ff),C(e=>e.value.view.ref?.name),k(D),Wt()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(vf);return B({id:ab(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i??void 0,links:Ii(a)?a:void 0,navigateTo:u||void 0,description:f,technology:p,...xh(m?.props,t)})}}}function vS(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(Iu(e))return this.parseFqnExprWith(e);if(dc(e))return this.parseFqnExprOrWhere(e);F(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}const yS=W.getChild(`SpecificationParser`);function bS(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){yS.warn(M(e))}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){yS.warn(M(e))}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!D(r))continue;if(r in t.relationships){yS.warn(`Relationship kind "${r}" is already defined`);continue}let i=T(n.filter(If)??[],k(e=>this.isValid(e)&&bt(e.value)),At(e=>[e.key,Qx(gh(e.value))]),kt(w));t.relationships[r]={...i,...xh(n.filter(Ac),this.isValid)}}catch(e){yS.warn(M(e))}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){yS.warn(`Tag {tag} is already defined, skipping duplicate`,{tag:n});continue}D(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(e){yS.warn(M(e))}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){yS.warn(`Custom color "${r}" is already defined`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){yS.warn(M(e))}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!D(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(uu)),o=this.parseLinks(e),s=T(n.filter(Mf)??[],k(e=>this.isValid(e)),At(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=Qx(gh(s.notation));return{[r]:B({...c,notation:l,tags:i??void 0,...o&&Ii(o)&&{links:o},style:a})}}}}const xS=W.getChild(`ViewsParser`),SS=xS.getChild(`rank`);function CS(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return xS.warn(M(e)),[]}}),r=t.folder&&!A(t.folder.trim())?Zx(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case mu(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case zl(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case kl(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){xS.warn(M(e))}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=Qy(e.viewOf),n=t&&ob(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;xS.warn(`viewOf {viewId} not resolved {msg}`,{msg:n,viewId:t})}}let a=e.name;a||=`view_`+ab(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(T(n.props,k(e=>this.isValid(e)),k(mp),At(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=zb(e),d={[Ra]:`element`,id:a,astPath:r,title:Zx(o)??null,description:s,tags:c,links:Ii(l)?l:null,rules:[...t,...n.rules.flatMap(e=>{try{return this.isValid(e)?this.parseElementViewRule(e):[]}catch(e){return xS.warn(M(e)),[]}})],...i&&{viewOf:i},...u&&{manualLayout:u}};if(fh.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(cp(e))return this.parseViewRulePredicate(e);if(np(e))return this.parseViewRuleGlobalPredicateRef(e);if(Hc(e))return this.parseViewRuleStyleOrGlobalRef(e);if(ep(e))return Ch(e);if(op(e))return this.parseViewRuleGroup(e);if(up(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;try{if(D(e)&&this.isValid(e)){let n=this.parsePredicate(e);t.unshift(n)}}catch(e){xS.warn(M(e))}if(!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(fp(e))return this.parseViewRuleStyle(e);if(ip(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(cp(n)){t.push(this.parseViewRulePredicate(n));continue}if(op(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){xS.warn(M(e))}return{title:Zx(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>to.isFqnExpr(e)),n=e.value??`same`;return SS.debug`Parsed rank constraint ${n} with ${t.length} target(s)`,{rank:n,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>to.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Ic)),r=Qx(gh(e.props.find(Gd)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+ab(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(T(i,k(mp),At(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);fh.writeId(e,o);let d=zb(e),f=nn(i,Ul)?.value;return{[Ra]:`dynamic`,id:o,astPath:a,title:Zx(s)??null,description:c,tags:l,links:Ii(u)?u:null,variant:f,rules:[...t,...n.rules.flatMap(e=>{try{return r(e)?this.parseDynamicViewRule(e):[]}catch(e){return xS.warn(M(e)),[]}},[])],steps:n.steps.reduce((e,t)=>{try{r(t)&&(Yl(t)?e.push(this.parseDynamicParallelSteps(t)):e.push(this.parseDynamicStep(t)))}catch(e){xS.warn(M(e))}return e},[]),...d&&{manualLayout:d}}}parseDynamicViewRule(e){if(ql(e))return this.parseDynamicViewIncludePredicate(e);if(Gl(e))return this.parseViewRuleGlobalPredicateRef(e);if(Hc(e))return this.parseViewRuleStyleOrGlobalRef(e);if(ep(e))return Ch(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;){try{if(bt(n.value)&&this.isValid(n.value)&&pc(n.value)){let e=this.parseElementPredicate(n.value);t.unshift(e)}}catch(e){xS.warn(M(e))}n=n.prev}return{include:t}}parseDynamicParallelSteps(e){let t=wS(e),n=e.steps.map(e=>this.parseDynamicStep(e));return P(Ii(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(Rp(e))return P(this.isValid(e)),this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(Ii(t),`Dynamic step chain must have at least one step`),{seriesId:wS(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(Rp(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!Ii(n)||!this.isValid(e))return[];let r=gt(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=Qy(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=Qy(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:wS(e)},r=Qx(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case ff(t):{let e=t.value.view.ref?.name;D(e)&&(n.navigateTo=e);break}case gf(t):case Gd(t):if(mt(t.value))if(t.key===`description`){let e=Qx(t.value);e&&(n.description=e)}else n[t.key]=Qx(gh(t.value))??``;break;case qd(t):mt(t.value)&&(n[t.key]=Qx(t.value));break;case il(t):mt(t.value)&&(n[t.key]=t.value);break;case cl(t):{let e=Sh(t);mt(e)&&(n[t.key]=e);break}case Cd(t):mt(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){xS.warn(M(e))}return n}}}function wS(e){let t=e,n=[];for(;!Vl(t);)Tt(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}Xe();const TS=T($x,uS,mS,_S,nS,rS,vS,bS,CS,fS);var ES=class extends TS{};const DS=W.getChild(`ModelParser`);var OS=class{cachedParsers=new kn.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(m.Linked,async e=>{this.cachedParsers.has(e)&&(DS.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:se.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(m.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){G(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(m.Validated,async e=>{e.diagnostics?.some(e=>e.severity===ze.Error)&&this.cachedParsers.has(e)&&(DS.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:se.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){P(mh(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=se.basename(e.uri);e.likec4ProjectId?DS.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:t}):DS.warn(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<m.Linked&&DS.warn(`Document {doc} is not linked, state is {state}`,{doc:t,state:e.state});let n={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new On.default(Set)};e=Object.assign(e,n);let r=new ES(this.services,e);try{r.parseSpecification(),r.parseImports(),r.parseModel(),r.parseGlobals(),r.parseDeployment(),r.parseViews()}catch(t){throw Error(`Error parsing document ${e.uri.fsPath}`,{cause:t})}return r}},kS=class extends Ne{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),oe.convertString(t)):super.runConverter(e,t,n)}};Xe();const{findNodeForKeyword:AS}=tt,jS=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...Yt(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},MS=(e,t)=>n=>{if(!fp(n)&&!Fl(n))return!1;let r=n.targets.value;if(!r||D(n.targets.prev)||r.$type!==`FqnRefExpr`||D(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function NS(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=gt(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=k(n.body.rules,e=>fp(e)||Fl(e)),u=t[Ra]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=fn(l,MS(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>jS(e,i,s));h.push(Ie.insert(o,`
1228
+ `).join(` `)}}function sC(e){if(e!=null)switch(!0){case sn(e):return Wr(e).trim();case rf(e)&&sn(e.markdown):return{md:Wr(e.markdown).trim()};case rf(e)&&sn(e.text):return{txt:Wr(e.text).trim()};case rf(e):return{txt:``};default:return}}var cC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=rC(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(u(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?aC.getChild(n).debug(r):aC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return C(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(zd(e)){let t=mx(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),po(t,n)}return ed(e)?lx(e.element):Xu(e)?lx(e.deploymentNode):Sc(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||wt(e.props))return;let t=e=>{if(rf(e)){let t=sC(e);if(!t)return[];if(typeof t==`string`)return b(t)?[t]:[];{let e=t.md||t.txt;return b(e)?[e]:[]}}else if(of(e))return e.values.map(e=>sC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(b);return[]},n=w(e.props,C(e=>t(e.value).map(t=>[e.key,t])),D(([e,t])=>b(t)));if(wt(n))return;let r=w(n,At(([e])=>e),zt(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return wt(i)?void 0:i}parseMarkdownOrString(e){if(rf(e))return sC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(b)),t=t.prev;return ta(n)?qt(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,D(e.props,tf),e=>{let t=e.value;if(An(t))return;let n=b(e.title)?oC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return B({url:t,title:n,relative:r&&r!==t?r:void 0})});return ta(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Sr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&vr(n):return hr(this.doc.uri.toString(),`../`,n);case n&&br(n):return xr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){aC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?xr(i,r):i;return xr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(kd(e))return`#${e.hex}`;if(Xf(e)){let t=It(e.alpha)?e.alpha:void 0;return sn(e.alpha)&&(t=th(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(Bt(e)){let t=this.parseStyleProps(e.find(zu)?.props);try{let n=this.parseIconProperty(e.find(Fd));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case Fl(n):b(n.value)&&(t.border=n.value);break;case Ll(n):{let e=oh(n);b(e)&&(t.color=e);break}case Qf(n):b(n.value)&&(t.shape=n.value);break;case Fd(n):{let e=this.parseIconProperty(n);b(e)&&(t.icon=e);break}case jd(n):{let e=oh(n);b(e)&&(t.iconColor=e);break}case Ld(n):b(n.value)&&(t.iconSize=rh(n));break;case Nd(n):b(n.value)&&(t.iconPosition=ih(n));break;case Ef(n):t.opacity=nh(n);break;case vf(n):t.multiple=Ot(n.value)?n.value:!1;break;case ep(n):b(n.value)&&(t.size=rh(n));break;case Af(n):b(n.value)&&(t.padding=rh(n));break;case Dp(n):b(n.value)&&(t.textSize=rh(n));break;default:F(n)}}catch(e){this.logError(e,n)}return B(t)}parseBaseProps(e,t){let n=sC(t?.title??eh(e.title)),r=t?.description?{txt:sC(t.description)}:this.parseMarkdownOrString(e.description);return B({title:n,summary:t?.summary?{txt:sC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:oC(t?.technology)??sC(eh(e.technology))})}};function*lC(e){let t=Bn.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(eu(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function uC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of lC(e))try{switch(!0){case eu(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Wl(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case Jl(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case Xu(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(qc)),c=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return B({id:n,kind:r,title:l??ia(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qc)),s=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return B({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qc)),r=this.parseLinks(e.body);return!t&&wt(n??{})&&!r?null:B({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(Vt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(V.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(V.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(qc)),l=w(e.body?.props??[],D(Kf),D(e=>b(e.value)),Et(e=>[e.key,e.value])),u=w(e.body?.props??[],D(Hf),$t())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Jf);return B({id:hx(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...ah(f?.props,t),navigateTo:u,astPath:n})}}}function dC(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+hx(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(w(n,D(Wp),Et(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);Zm.writeId(e,i);let l=eS(e);return{[ro]:`deployment`,id:i,astPath:r,title:oC(a)??null,description:o,tags:s,links:ta(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e)),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(cu(e))return this.parseDeploymentViewRulePredicate(e);if(Ap(e))return sh(e);if(uu(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Mt(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){G(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(dl)),n=sC(eh(e.props.find(Sf)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const fC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function pC(e){return!im(e)&&!om(e)?null:e.participant}function mC(e){switch(!0){case Al(e):{let t=e.value.tag.ref?.name,n=pC(e);P(t,`Expected tag name`);let r={tag:fC(e,t)};return n?{participant:n,operator:r}:r}case wl(e):{let t=e.value?.ref?.name,n=pC(e);P(t,`Expected kind name`);let r={kind:fC(e,t)};return n?{participant:n,operator:r}:r}case Xp(e)||nm(e):return{not:mC(e.value)};case Kp(e):{let t=mC(e.left),n=mC(e.right);return hC(e.operator.toLowerCase(),t,n)}default:F(e)}}function hC(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[ko(t)?t.and:t,ko(n)?n.and:n].flat();return P(ta(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[Ao(t)?t.or:t,Ao(n)?n.or:n].flat();return P(ta(e),`Expected non-empty array`),{or:e}}default:F(e)}}function gC(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(zd(t)){let e={project:mx(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Du(t)){let n=fx(e);if(n){let e={project:mx(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=dx(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Sc(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(Hc(e))return this.parseFqnExprOrWith(e);if(nl(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(fd(e))return this.parseFqnExprWith(e);if(Bc(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(bf(t)){let n=t.value.view.$refText;return b(n)&&(e.custom.navigateTo=n),e}if(wf(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Lu(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=sC(eh(t.value));return n&&(e.custom[t.key]=n),e}if(Fd(t)){let n=this.parseIconProperty(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Ll(t)){let n=oh(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Qf(t)||Fl(t))return Vt(t.value)&&(e.custom[t.key]=t.value),e;if(Ef(t))return Vt(t.value)&&(e.custom[t.key]=nh(t)),e;if(jd(t)){let n=oh(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Sf(t)){let n=b(t.value)?sC(eh(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(vf(t))return Ot(t.value)&&(e.custom[t.key]=t.value),e;if(ep(t)||Dp(t)||Af(t)||Ld(t))return b(t.value)&&(e.custom[t.key]=rh(t)),e;if(Nd(t))return b(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(ud(e))return this.parseFqnExprWhere(e);if(Rc(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!ud(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?mC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(um(e))return{wildcard:!0};if(Nu(e))return P(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Vu(e))return P(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(gd(e))return this.parseFqnRefExpr(e);F(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{Mt(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(Rf(e))return this.parseRelationExprWith(e);if(el(e))return this.parseRelationExprOrWhere(e);F(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(wf(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(Kf(t)||Sf(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=sC(eh(t.value));return n&&(e[t.key]=n),e}if(Nl(t))return b(t.value)&&(e[t.key]=t.value),e;if(Ll(t)){let n=oh(t);return b(n)&&(e[t.key]=n),e}if($d(t))return b(t.value)&&(e[t.key]=t.value),e;if(Hf(t)){let n=t.value.view.ref?.name;return b(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(If(e))return this.parseRelationExprWhere(e);if(Qc(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!If(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?mC(e.where):null,a;return a=i&&r?hC(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:F(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function _C(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!b(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!b(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);E(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(bd(e)){let r=this.parseGlobalPredicateGroup(e);E(r,1)&&(n.predicates[t]=r);return}if(vd(e)){let r=this.parseGlobalDynamicPredicateGroup(e);E(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(wd(e))return[this.parseViewRuleStyle(e)];if(Ed(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}function vC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*yC(e){let t=Bn.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Mf(r)){n.push(r);continue}if(id(r)){n.push(r);continue}if(r.body?.elements&&E(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function bC(e){return class extends e{parseModel(){let e=this.doc;for(let t of yC(e))try{if(Du(t)){e.c4Elements.push(this.parseElement(t));continue}if(Mf(t)){e.c4Relations.push(this.parseRelation(t));continue}if(ed(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(id(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qc)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return B({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qc)),r=this.parseLinks(e.body);if(!t&&An(n)&&!r)return null;let i=this.getAstNodePath(e);return B({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(V.isModelRef(t)||V.isImportRef(t),`Source must be a model reference`),P(V.isModelRef(n)||V.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(qc)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&wt(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return B({id:hx(`extend-relation`,V.flatten(t),V.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(Vt(e.source)){let t=this.parseFqnRef(e.source);return P(V.isModelRef(t)||V.isImportRef(t),`Relation source must be a model reference`),t}if(ku(e.$container)||nd(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(qc)),c=this.getAstNodePath(e),l=w(e.body?.props??[],D(Kf),D(e=>b(e.value)),Et(e=>[e.key,e.value])),u=w(e.body?.props??[],D(Hf),x(e=>e.value.view.ref?.name),D(b),$t()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Jf);return B({id:hx(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...ah(m?.props,t)})}}}function xC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(fd(e))return this.parseFqnExprWith(e);if(Bc(e))return this.parseFqnExprOrWhere(e);F(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!b(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=w(n.filter(fp)??[],D(e=>this.isValid(e)&&Mt(e.value)),Et(e=>[e.key,sC(eh(e.value))]),Tt(S));t.relationships[r]={...i,...ah(n.filter(al),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}b(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!b(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(zu)),o=this.parseLinks(e),s=w(n.filter(cp)??[],D(e=>this.isValid(e)),Et(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=sC(eh(s.notation));return{[r]:B({...c,notation:l,tags:i??void 0,...o&&ta(o)&&{links:o},style:a})}}}}function CC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!wt(t.folder.trim())?oC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Uu(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case mu(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case iu(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=cx(e.viewOf),n=t&&gx(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+hx(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(w(n.props,D(e=>this.isValid(e)),D(Wp),Et(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=eS(e),d={[ro]:`element`,id:a,astPath:r,title:oC(o)??null,description:s,tags:c,links:ta(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i},...u&&{manualLayout:u}};if(Zm.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(Rp(e))return this.parseViewRulePredicate(e);if(Mp(e))return this.parseViewRuleGlobalPredicateRef(e);if(_l(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ap(e))return sh(e);if(Ip(e))return this.parseViewRuleGroup(e);if(Bp(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(Hp(e))return this.parseViewRuleStyle(e);if(Pp(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Rp(n)){t.push(this.parseViewRulePredicate(n));continue}if(Ip(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){this.logError(e,n,`views`)}return{title:oC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>So.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>So.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(dl)),r=sC(eh(e.props.find(Sf)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+hx(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(w(i,D(Wp),Et(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Zm.writeId(e,o);let d=eS(e),f=mn(i,vu)?.value;return{[ro]:`dynamic`,id:o,astPath:a,title:oC(s)??null,description:c,tags:l,links:ta(u)?u:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>wu(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e)),...d&&{manualLayout:d}}}parseDynamicViewRule(e){if(Su(e))return this.parseDynamicViewIncludePredicate(e);if(bu(e))return this.parseViewRuleGlobalPredicateRef(e);if(_l(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ap(e))return sh(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Hc(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=wC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return P(ta(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(mm(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(ta(t),`Dynamic step chain must have at least one step`),{seriesId:wC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(mm(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!ta(n)||!this.isValid(e))return[];let r=Ft(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=cx(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=cx(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:wC(e)},r=sC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Hf(t):{let e=t.value.view.ref?.name;b(e)&&(n.navigateTo=e);break}case Kf(t):case Sf(t):if(Vt(t.value))if(t.key===`description`){let e=sC(t.value);e&&(n.description=e)}else n[t.key]=sC(eh(t.value))??``;break;case wf(t):Vt(t.value)&&(n[t.key]=sC(t.value));break;case Nl(t):Vt(t.value)&&(n[t.key]=t.value);break;case Ll(t):{let e=oh(t);Vt(e)&&(n[t.key]=e);break}case $d(t):Vt(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function wC(e){let t=e,n=[];for(;!gu(t);)It(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}De();const TC=w(cC,gC,vC,bC,uC,dC,xC,SC,CC,_C);var EC=class extends TC{};const DC=W.getChild(`parser`),OC=e=>e.severity===Ge.Error;var kC=class{cachedParsers=new Rn.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(_.Linked,async e=>{this.cachedParsers.has(e)&&(DC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:le.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(_.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){G(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(_.Validated,async e=>{e.diagnostics?.some(OC)&&this.cachedParsers.has(e)&&(DC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:le.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){P($m(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=le.relative(t.folderUri,e.uri);e.likec4ProjectId?DC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):DC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<_.Linked&&DC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new In.default(Set)};e=Object.assign(e,r);let i=new EC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},AC=class extends oe{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),se.convertString(t)):super.runConverter(e,t,n)}};De();const{findNodeForKeyword:jC}=f,MC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...on(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},NC=(e,t)=>n=>{if(!Hp(n)&&!uu(n))return!1;let r=n.targets.value;if(!r||b(n.targets.prev)||r.$type!==`FqnRefExpr`||b(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function PC(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=Ft(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=D(n.body.rules,e=>Hp(e)||uu(e)),u=t[ro]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Cn(l,NC(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>MC(e,i,s));h.push(Ze.insert(o,`
549
1229
  `+e.join(`
550
- `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:gt(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;P(t,`RuleCstNode not found`);for(let[n,r]of Yt(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(Ie.replace({start:e,end:t},n+` `+i));continue}let o=AS(t,`{`)?.range.end;P(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(Ie.insert(o,`
551
- `+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}Xe();const{findNodeForKeyword:PS}=tt;function FS(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=wh(r.direction),o=fn(n.body.rules,ep),s=`autoLayout ${a}`;if(Tt(r.rankSep)&&(s+=` ${r.rankSep}`,Tt(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ie.replace(o.$cstNode.range,s);let c=PS(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ie.insert(c,l)}Xe();async function IS(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;P(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;P(r,`LSP Connection not available`);let i=ee(n,[`BLOCK_COMMENT`]);return i&&Lb(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[Ie.del(i.range)]}}})).applied:!1}Xe();const LS=W.getChild(`model-changes`);var RS=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);LS.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&await IS(this.services,{lookup:s}).catch(e=>{LS.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&await IS(this.services,{lookup:s}).catch(e=>{LS.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=M(Ur(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return LS.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return NS(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=FS(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},zS=class extends Qe{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(fe(e))return e.name;if(ld(e))return e.imported.$refText;if(hl(e))return e.target.modelElement.value.$refText}getNameNode(e){if(fe(e))return super.getNameNode(e);if(ld(e))return e.imported.$refNode;if(hl(e))return e.target.modelElement.value.$refNode}};function BS(e){return T(e,sn(e=>`${e.type}.${e.name}`),Yt(),Dt(([e,t])=>t.length===1?t:[]))}var VS=class extends de{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){G(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(w(r)||r.length===0))for(let e of r)try{D(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}exportGlobals(e,t,n){if(!(w(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;D(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;D(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}}exportModel(e,t,n){if(!(w(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Ql(r)&&D(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportLibrary(e,t,n){if(!w(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportSpecification(e,t,n){if(!(w(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case Of(r):case Af(r):D(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Bf(r):D(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case Pf(r):D(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Ef(r):D(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){G(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(w(r)||r.length===0))for(let e of r)try{yl(e)&&D(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new p;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){G(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){G(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){G(e)}BS(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new p,i=[];for(let a of e.elements){if(tf(a))continue;let e;if(Ql(a)?(D(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):Tu(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){G(e)}}i.length&&T(i,k(e=>!r.has(e.name)),sn(e=>e.name),Pt((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new p,i=[];for(let a of e.elements){if(Tl(a))continue;let e=a.body;if(!xu(a)){let i=this.nameProvider.getName(a);if(D(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){G(e)}}i.length&&T(i,k(e=>!r.has(e.name)),sn(e=>e.name),Pt((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:HS}=f;var US=class extends ye{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=ib(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(Ru(r))return new $e(this.streamForFqnRef(t,r,e));if(Wf(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Zl)return this.getProjectScope(t,n,e);if(ld(r)){let e=ib(r);return new $e(this.fqnIndex.rootElements(e))}if(Hf(r)&&e.property===`el`){let i=r.parent;return i?new $e(this.fqnIndex.directChildrenOf(t,$y(i))):this.getProjectScope(t,n,e)}return new $e(Ue(this.computeScope(t,e)))}catch(r){return G(r),this.getProjectScope(t,n,e)}}catch(e){return G(e),et}}*genUniqueDescedants(e){if(!e)return;let t=ib(e);if(Ql(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(yl(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(Qy(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(Qy(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new $e(this.deploymentsIndex.directChildrenOf(e,$y(r)).filter(e=>this.reflection.isSubtype(e.type,vl))):this.getProjectScope(e,vl,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&yl(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return Ue(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return ie;if(ld(i))return Ue(this.genUniqueDescedants(i.imported.ref));if(yl(i))return Ue(this.genUniqueDescedants(i));if(hl(i)){let e=i.target.modelElement.value.ref,t=ld(e)?e.imported.ref:Ql(e)?e:void 0;return Ue(this.genUniqueDescedants(t))}return Ql(i)?Ue(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){pe(t,ou)||kh(t)?yield*this.computeScope(e,n,Zl):Oh(t)?(yield*this.computeScope(e,n,Zl),yield*this.computeScope(e,n,vl),yield*this.computeScope(e,n,ml)):(yield*this.computeScope(e,n,vl),yield*this.computeScope(e,n,ml),pe(t,jl)&&(yield*this.computeScope(e,n,Zl)));let r=HS(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,cd)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Zl),i=this.reflection.isSubtype(n,Ks),a=HS(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&Cu(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&Du(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&gu(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===gd?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new Se(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===gd)return super.getGlobalScope(e,t);let n=ib(t.container);return this.getProjectScope(n,e,t)}},WS=Ee();let GS;(function(e){e.type=new WS.NotificationType(`likec4/onDidChangeModel`)})(GS||={});let KS;(function(e){e.type=new WS.NotificationType0(`likec4/onDidChangeProjects`)})(KS||={});let qS;(function(e){e.type=new WS.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(qS||={});let JS;(function(e){e.type=new WS.NotificationType(`likec4/onRequestOpenView`)})(JS||={});let YS;(function(e){e.req=new WS.RequestType(`likec4/fetchComputedModel`)})(YS||={});let XS;(function(e){e.req=new WS.RequestType0(`likec4/fetchViewsFromAllProjects`)})(XS||={});let ZS;(function(e){e.req=new WS.RequestType(`likec4/fetchLayoutedModel`)})(ZS||={});let QS;(function(e){e.req=new WS.RequestType(`likec4/layout-view`)})(QS||={});let $S;(function(e){e.req=new WS.RequestType(`likec4/validate-layout`)})($S||={});let eC;(function(e){e.req=new WS.RequestType0(`likec4/reload-projects`)})(eC||={});let tC;(function(e){e.req=new WS.RequestType0(`likec4/fetch-projects`)})(tC||={});let nC;(function(e){e.req=new WS.RequestType(`likec4/register-project`)})(nC||={});let rC;(function(e){e.req=new WS.RequestType(`likec4/build`)})(rC||={});let iC;(function(e){e.req=new WS.RequestType(`likec4/locate`)})(iC||={});let aC;(function(e){e.req=new WS.RequestType(`likec4/change-view`)})(aC||={});let oC;(function(e){e.req=new WS.RequestType0(`likec4/metrics`)})(oC||={});let sC;(function(e){e.req=new WS.RequestType(`likec4/document-tags`)})(sC||={});let cC;(function(e){e.req=new WS.RequestType0(`likec4/fetch-projects-overview`)})(cC||={});const Q=W.getChild(`rpc`);var lC=class extends Zy{constructor(e){super(),this.services=e}init(){let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=xt(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(GS.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=xt(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(KS.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(YS.req,async({projectId:e,cleanCaches:n},a)=>{if(Q.debug`received request ${`fetchComputedModel`} for project ${e} (cleanCaches: ${n})`,n){let t=(e?r.projectDocuments(e):r.allExcludingBuiltin).toArray().map(e=>e.uri);await i.update(t,[],a)}let o=await t.ModelBuilder.computeModel(e,a);return o===Mm.EMPTY?{model:null}:{model:o.$data}}),e.onNotification(qS.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`;let t=_.parse(e);n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuidProject(n.ProjectsManager.belongsTo(t.path))}),e.onRequest(ZS.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:jt(i,e=>e.id)}}}),e.onRequest(QS.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest($S.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(tC.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:gn(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:C(e,e=>e.uri.toString())}})})),e.onRequest(eC.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(nC.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`;let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(_.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(XS.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Pe(e);try{let n=await t.Views.computedViews(i,e);r.push(...T(n,C(e=>({id:e.id,title:e.title??e.id,projectId:i})),Ht((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(rC.req,async({docs:t},n)=>{let a=t.map(e=>_.parse(e)),o=e=>a.every(t=>!se.equals(t,e)),c=r.allExcludingBuiltin.toArray().filter(e=>o(e.uri)).map(e=>e.uri);Q.debug(`[ServerRpc] received request to build:
1230
+ `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Ft(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;P(t,`RuleCstNode not found`);for(let[n,r]of on(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(Ze.replace({start:e,end:t},n+` `+i));continue}let o=jC(t,`{`)?.range.end;P(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(Ze.insert(o,`
1231
+ `+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}De();const{findNodeForKeyword:FC}=f;function IC(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=ch(r.direction),o=Cn(n.body.rules,Ap),s=`autoLayout ${a}`;if(It(r.rankSep)&&(s+=` ${r.rankSep}`,It(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ze.replace(o.$cstNode.range,s);let c=FC(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ze.insert(c,l)}De();async function LC(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;P(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;P(r,`LSP Connection not available`);let i=ie(n,[`BLOCK_COMMENT`]);return i&&Qx(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[Ze.del(i.range)]}}})).applied:!1}De();const RC=W.getChild(`model-changes`);var zC=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);RC.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&t&&await LC(this.services,{lookup:s}).catch(e=>{RC.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&await LC(this.services,{lookup:s}).catch(e=>{RC.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=ci(li(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return RC.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return PC(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=IC(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},BC=class extends h{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(m(e))return e.name;if(zd(e))return e.imported.$refText;if(Wl(e))return e.target.modelElement.value.$refText}getNameNode(e){if(m(e))return super.getNameNode(e);if(zd(e))return e.imported.$refNode;if(Wl(e))return e.target.modelElement.value.$refNode}};function VC(e){return w(e,At(e=>`${e.type}.${e.name}`),on(),C(([e,t])=>t.length===1?t:[]))}var HC=class extends $e{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){G(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(S(r)||r.length===0))for(let e of r)try{b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}exportGlobals(e,t,n){if(!(S(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}}exportModel(e,t,n){if(!(S(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Du(r)&&b(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportLibrary(e,t,n){if(!S(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportSpecification(e,t,n){if(!(S(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case ip(r):case op(r):b(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gp(r):b(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case up(r):b(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case np(r):b(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){G(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(S(r)||r.length===0))for(let e of r)try{Jl(e)&&b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new pe;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){G(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){G(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){G(e)}VC(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new pe,i=[];for(let a of e.elements){if(Mf(a))continue;let e;if(Du(a)?(b(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):ed(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){G(e)}}i.length&&w(i,D(e=>!r.has(e.name)),At(e=>e.name),Ut((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new pe,i=[];for(let a of e.elements){if(eu(a))continue;let e=a.body;if(!Xu(a)){let i=this.nameProvider.getName(a);if(b(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){G(e)}}i.length&&w(i,D(e=>!r.has(e.name)),At(e=>e.name),Ut((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:UC}=he;var WC=class extends Qe{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=mx(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(md(r))return new p(this.streamForFqnRef(t,r,e));if(bp(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Eu)return this.getProjectScope(t,n,e);if(zd(r)){let e=mx(r);return new p(this.fqnIndex.rootElements(e))}if(vp(r)&&e.property===`el`){let i=r.parent;return i?new p(this.fqnIndex.directChildrenOf(t,lx(i))):this.getProjectScope(t,n,e)}return new p(re(this.computeScope(t,e)))}catch(r){return G(r),this.getProjectScope(t,n,e)}}catch(e){return G(e),et}}*genUniqueDescedants(e){if(!e)return;let t=mx(e);if(Du(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(Jl(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(cx(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(cx(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new p(this.deploymentsIndex.directChildrenOf(e,lx(r)).filter(e=>this.reflection.isSubtype(e.type,ql))):this.getProjectScope(e,ql,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&Jl(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return re(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return Ue;if(zd(i))return re(this.genUniqueDescedants(i.imported.ref));if(Jl(i))return re(this.genUniqueDescedants(i));if(Wl(i)){let e=i.target.modelElement.value.ref,t=zd(e)?e.imported.ref:Du(e)?e:void 0;return re(this.genUniqueDescedants(t))}return Du(i)?re(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){ge(t,Fu)||ph(t)?yield*this.computeScope(e,n,Eu):fh(t)?(yield*this.computeScope(e,n,Eu),yield*this.computeScope(e,n,ql),yield*this.computeScope(e,n,Ul)):(yield*this.computeScope(e,n,ql),yield*this.computeScope(e,n,Ul),ge(t,ou)&&(yield*this.computeScope(e,n,Eu)));let r=UC(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Rd)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Eu),i=this.reflection.isSubtype(n,xc),a=UC(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&Qu(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&nd(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Gu(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Kd?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new fe(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Kd)return super.getGlobalScope(e,t);let n=mx(t.container);return this.getProjectScope(n,e,t)}},GC=Ae();let KC;(function(e){e.type=new GC.NotificationType(`likec4/onDidChangeModel`)})(KC||={});let qC;(function(e){e.type=new GC.NotificationType0(`likec4/onDidChangeProjects`)})(qC||={});let JC;(function(e){e.type=new GC.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(JC||={});let YC;(function(e){e.type=new GC.NotificationType(`likec4/onRequestOpenView`)})(YC||={});let XC;(function(e){e.req=new GC.RequestType(`likec4/fetchComputedModel`)})(XC||={});let ZC;(function(e){e.req=new GC.RequestType0(`likec4/fetchViewsFromAllProjects`)})(ZC||={});let QC;(function(e){e.req=new GC.RequestType(`likec4/fetchLayoutedModel`)})(QC||={});let $C;(function(e){e.req=new GC.RequestType(`likec4/layout-view`)})($C||={});let ew;(function(e){e.req=new GC.RequestType(`likec4/validate-layout`)})(ew||={});let tw;(function(e){e.req=new GC.RequestType0(`likec4/reload-projects`)})(tw||={});let nw;(function(e){e.req=new GC.RequestType0(`likec4/fetch-projects`)})(nw||={});let rw;(function(e){e.req=new GC.RequestType(`likec4/register-project`)})(rw||={});let iw;(function(e){e.req=new GC.RequestType(`likec4/build`)})(iw||={});let aw;(function(e){e.req=new GC.RequestType(`likec4/locate`)})(aw||={});let ow;(function(e){e.req=new GC.RequestType(`likec4/change-view`)})(ow||={});let sw;(function(e){e.req=new GC.RequestType0(`likec4/metrics`)})(sw||={});let cw;(function(e){e.req=new GC.RequestType(`likec4/document-tags`)})(cw||={});let lw;(function(e){e.req=new GC.RequestType0(`likec4/fetch-projects-overview`)})(lw||={});const Q=W.getChild(`rpc`);var uw=class extends sx{constructor(e){super(),this.services=e}init=Rt(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=Wt(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(KC.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=Wt(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(qC.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(XC.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===gg.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(JC.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest(QC.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:Ht(i,e=>e.id)}}}),e.onRequest($C.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(ew.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(nw.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:zt(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:x(e,e=>e.uri.toString())}})})),e.onRequest(tw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(rw.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(g.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(ZC.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await d(e);try{let n=await t.Views.computedViews(i,e);r.push(...w(n,x(e=>({id:e.id,title:e.title??e.id,projectId:i})),Zt((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(iw.req,async({docs:t},n)=>{let a=t.map(e=>g.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>le.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
552
1232
  changed (total ${a.length}):${t.map(e=>`
553
1233
  - `+e).join(``)}
554
- deleted (total ${c.length}):${c.map(e=>`
1234
+ deleted (total ${o.length}):${o.map(e=>`
555
1235
  - `+e.toString()).join(`
556
- `)}`),!s&&a.length+c.length>0&&await Promise.allSettled([...a,...c].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await Pe(n),await i.update(a,c,n)}),e.onRequest(iC.req,e=>{switch(Q.debug`received request ${`locate`}, ${e}`,!0){case`element`in e:return t.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,e.projectId);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:e.projectId});case`view`in e:return t.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}),e.onRequest(aC.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuidProject(e.projectId,r),i}),e.onRequest(oC.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Mm.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=Et(n.specification.elements).length,r.deploymentKinds+=Et(n.specification.deployments).length,r.relationshipKinds+=Et(n.specification.relationships).length,r.tags+=Et(n.specification.tags).length,r.customColors+=Et(n.specification.customColors??{}).length,r.elements+=Et(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=Et(n.$data.relations).length,r.views+=Et(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Pe(e),{metrics:r}}),e.onRequest(sC.req,async({documentUri:e},n)=>({tags:await t.ModelLocator.locateDocumentTags(_.parse(e),n)})),e.onRequest(cC.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Ae.create(()=>{a.cancel()}));function c(e){return T(e,k(e=>!!e.hasLayoutDrift),C(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:vb.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}}async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(JS.type,e)}};Xe();var uC=class{constructor(e){this.services=e}getSymbolKind(e){let t=le(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Zl,wu,vl,ml,cd):return we.Constructor;case n(Pd,Rd,Id,Gu,Lf):return we.Namespace;case n(hc):return we.Class;case n(`Tag`,gd,ll,zf):return we.EnumMember;case n(pf,Nf):return we.Event;case n(tu,Sl,kf,Df):return we.TypeParameter}return we.Field}getCompletionItemKind(e){let t=le(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(ll):return v.Color;case n(Zl,vl,ml,wu,cd):return v.Constructor;case n(Pd,Rd,Id,Gu,Lf):return v.Module;case n(hc):return v.Class;case n(`Tag`,gd,ll,zf):return v.EnumMember;case n(pf,Nf):return v.Event;case n(tu,kf,Sl,Df):return v.TypeParameter;default:return v.Reference}}},dC=class extends Be{};const fC=W.getChild(`views`);var pC=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return cn((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=cn(e.$data.views);if(n.length===0)return[];let r=cb(),i=e.project.id,a=fC.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await Pe(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=fC.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=cb(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),D(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=M(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=cn(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):G(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){fC.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Jy(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return fC.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[za]===`manual`?(fC.error(`View ${e.id} already has manual layout, this should not happen`),e):Es(e,r):ks(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};function mC(e){return{lsp:{NodeKindProvider:e=>new uC(e),WorkspaceSymbolProvider:e=>new dC(e)},workspace:{Cache:e=>new Ze(e,m.Validated),IndexManager:e=>new uh(e),LangiumDocuments:e=>new Ph(e),ProjectsManager:e=>new Hh(e),WorkspaceManager:e=>new Wh(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function hC(e){return{documentation:{DocumentationProvider:$(b_)},validation:{DocumentValidator:$(Wx)},Rpc:$(lC),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(Xy),Layouter:e=>new y_({graphviz:new m_}),Views:$(pC),DeploymentsIndex:$(Nb),ModelChanges:$(RS),FqnIndex:$(Ab),ModelParser:$(OS),ModelBuilder:$(qb),ModelLocator:$(ex)},lsp:{CompletionProvider:$(fb),DocumentHighlightProvider:$(pb),DocumentSymbolProvider:$(gb),SemanticTokenProvider:$(Eb),HoverProvider:$(_b),CodeLensProvider:$(lb),DocumentLinkProvider:$(mb),Formatter:$(T_),CodeActionProvider:$(yb)},workspace:{AstNodeDescriptionProvider:$(lh)},references:{NameProvider:$(zS),ScopeComputation:$(VS),ScopeProvider:$(US)},parser:{ValueConverter:$(kS)}}}function gC(e,t,n,r){let i=_C(e),a=ke([je({shared:i}),Gp,hC({...kb,...am,...om,...e}),t,n,r].reduce(vC,{}));return i.ServiceRegistry.register(a),Yx(a),e.connection?ma(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function _C(e={}){let t={...kb,...am,...om,...e};return ke(be(t),Wp,mC(t))}function vC(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=vC(t,r):e[n]=r}}return e}kr(Ar({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;ni({sinks:{console:$r(jr&&!t?{formatter:Xr()}:void 0)}}),process.on(`uncaughtException`,e=>{ei.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{ei.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=Nr(e.workspace||`.`);ei.info`Loading LikeC4 from workspace: ${r}`,e.watch&&ei.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`;let i=gC({...lm(e.watch),...zs,...gg(t?`stdio`:{port:n})});await i.shared.workspace.WorkspaceManager.initializeWorkspace([{uri:_.file(r).toString(),name:`workspace`}]),await i.likec4.mcp.Server.start()}})).catch(e=>{ei.error(e),process.exit(1)});export{};
1236
+ `)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await d(n),await i.update(a,o,n)}),e.onRequest(aw.req,e=>{switch(Q.debug`received request ${`locate`}, ${e}`,!0){case`element`in e:return t.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,e.projectId);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:e.projectId});case`view`in e:return t.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}),e.onRequest(ow.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(sw.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===gg.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=cn(n.specification.elements).length,r.deploymentKinds+=cn(n.specification.deployments).length,r.relationshipKinds+=cn(n.specification.relationships).length,r.tags+=cn(n.specification.tags).length,r.customColors+=cn(n.specification.customColors??{}).length,r.elements+=cn(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=cn(n.$data.relations).length,r.views+=cn(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await d(e),{metrics:r}}),e.onRequest(cw.req,async({documentUri:e},r)=>{let i=g.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(lw.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Me.create(()=>{a.cancel()}));function c(e){return w(e,D(e=>!!e.hasLayoutDrift),x(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Ax.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(YC.type,e)}};De();var dw=class{constructor(e){this.services=e}getSymbolKind(e){let t=u(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Eu,$u,ql,Ul,Rd):return Le.Constructor;case n(df,hf,pf,xd,pp):return Le.Namespace;case n(Wc):return Le.Class;case n(`Tag`,Kd,Rl,hp):return Le.EnumMember;case n(Uf,lp):return Le.Event;case n(Au,Zl,ap,rp):return Le.TypeParameter}return Le.Field}getCompletionItemKind(e){let t=u(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Rl):return v.Color;case n(Eu,ql,Ul,$u,Rd):return v.Constructor;case n(df,hf,pf,xd,pp):return v.Module;case n(Wc):return v.Class;case n(`Tag`,Kd,Rl,hp):return v.EnumMember;case n(Uf,lp):return v.Event;case n(Au,ap,Zl,rp):return v.TypeParameter;default:return v.Reference}}},fw=class extends Be{};const pw=W.getChild(`views`);var mw=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return yn((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=yn(e.$data.views);if(n.length===0)return[];let r=vx(),i=e.project.id,a=pw.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await d(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=pw.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=vx(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),b(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=ci(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=yn(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):G(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){pw.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=rx(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return pw.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[io]===`manual`?(pw.error(`View ${e.id} already has manual layout, this should not happen`),e):Ys(e,r):Qs(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};function hw(e){return{lsp:{NodeKindProvider:e=>new dw(e),WorkspaceSymbolProvider:e=>new fw(e)},workspace:{Cache:e=>new Ce(e,_.Validated),IndexManager:e=>new Ym(e),LangiumDocuments:e=>new vh(e),ProjectsManager:e=>new Fh(e),WorkspaceManager:e=>new Ih(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function gw(e){return{documentation:{DocumentationProvider:$(kv)},validation:{DocumentValidator:$(eC)},Rpc:$(uw),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(ox),Layouter:e=>new Ov({graphviz:new Cv}),Views:$(mw),DeploymentsIndex:$(Wx),ModelChanges:$(zC),FqnIndex:$(Bx),ModelParser:$(kC),ModelBuilder:$(sS),ModelLocator:$(mS),LastSeen:$(Jx)},lsp:{CompletionProvider:$(Sx),DocumentHighlightProvider:$(wx),DocumentSymbolProvider:$(Dx),SemanticTokenProvider:$(Rx),HoverProvider:$(kx),CodeLensProvider:$(yx),DocumentLinkProvider:$(Tx),Formatter:$(Pv),CodeActionProvider:$(jx)},workspace:{AstNodeDescriptionProvider:$(Jm)},references:{NameProvider:$(BC),ScopeComputation:$(HC),ScopeProvider:$(WC)},parser:{ValueConverter:$(AC)}}}function _w(e={},t,n,r){let i=vw(e),a=be([Ne({shared:i}),xm,gw({...Vm,...Pm,...Fm,...e}),t,n,r].reduce(yw,{}));return i.ServiceRegistry.register(a),iC(a),e.connection?Na(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function vw(e={}){let t={...Vm,...Pm,...Fm,...e};return be(xe(t),bm,hw(t))}function yw(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=yw(t,r):e[n]=r}}return e}Gr(),bi.getChild(`graphviz-binary`),Symbol.dispose,Kr(qr({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;Si({sinks:{console:yi(Jr&&!t?{formatter:gi()}:void 0)}}),process.on(`uncaughtException`,e=>{bi.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{bi.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=Zr(e.workspace||`.`);bi.info`Loading LikeC4 from workspace: ${r}`,e.watch&&bi.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`;let i=_w({...zm(e.watch),...mc,...T_(t?`stdio`:{port:n})});await i.shared.workspace.WorkspaceManager.initializeWorkspace([{uri:g.file(r).toString(),name:`workspace`}]),await i.likec4.mcp.Server.start()}})).catch(e=>{bi.error(e),process.exit(1)});export{};