@likec4/mcp 1.58.0 → 1.59.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 (40) hide show
  1. package/dist/chunks/libs/@chevrotain/cst-dts-gen.mjs +1 -0
  2. package/dist/chunks/libs/@chevrotain/regexp-to-ast.mjs +1 -1
  3. package/dist/chunks/libs/@hono/mcp.mjs +6 -6
  4. package/dist/chunks/libs/@hono/node-server.mjs +3 -1
  5. package/dist/chunks/libs/@logtape/logtape.mjs +4 -4
  6. package/dist/chunks/libs/@modelcontextprotocol/sdk.mjs +4 -11
  7. package/dist/chunks/libs/@ts-graphviz/core.mjs +1 -1
  8. package/dist/chunks/libs/chevrotain-allstar.mjs +2 -2
  9. package/dist/chunks/libs/chevrotain.mjs +33 -33
  10. package/dist/chunks/libs/chokidar.mjs +2 -2
  11. package/dist/chunks/libs/chroma-js.mjs +2 -2
  12. package/dist/chunks/libs/eventemitter3.mjs +1 -1
  13. package/dist/chunks/libs/graphology-dag.mjs +1 -1
  14. package/dist/chunks/libs/graphology.mjs +1 -1
  15. package/dist/chunks/libs/hast-util-sanitize.mjs +1 -1
  16. package/dist/chunks/libs/hast-util-to-html.mjs +2 -2
  17. package/dist/chunks/libs/hono.mjs +1 -1
  18. package/dist/chunks/libs/immer.mjs +1 -1
  19. package/dist/chunks/libs/langium.mjs +9 -22
  20. package/dist/chunks/libs/markdown-table.mjs +1 -1
  21. package/dist/chunks/libs/mdast-util-from-markdown.mjs +2 -2
  22. package/dist/chunks/libs/mdast-util-gfm.mjs +1 -1
  23. package/dist/chunks/libs/merge-error-cause.mjs +1 -1
  24. package/dist/chunks/libs/micromark-extension-gfm.mjs +1 -1
  25. package/dist/chunks/libs/mnemonist.mjs +1 -1
  26. package/dist/chunks/libs/nano-spawn.mjs +1 -1
  27. package/dist/chunks/libs/p-queue.mjs +1 -1
  28. package/dist/chunks/libs/picomatch.mjs +1 -0
  29. package/dist/chunks/libs/remark-github-blockquote-alert.mjs +1 -1
  30. package/dist/chunks/libs/remeda.mjs +1 -1
  31. package/dist/chunks/libs/unified.mjs +1 -1
  32. package/dist/chunks/rolldown-runtime.mjs +1 -1
  33. package/dist/chunks/src.mjs +102 -101
  34. package/dist/cli.mjs +3 -3
  35. package/package.json +18 -18
  36. package/dist/chunks/libs/@chevrotain/gast.mjs +0 -1
  37. package/dist/chunks/libs/@lume/kiwi.mjs +0 -1
  38. package/dist/chunks/libs/fdir.mjs +0 -1
  39. package/dist/chunks/libs/json5.mjs +0 -14
  40. package/dist/chunks/libs/which.mjs +0 -1
@@ -1,4 +1,4 @@
1
- import{c as e,i as t,r,t as s}from"./rolldown-runtime.mjs";import{t as c}from"./libs/@radix-ui/colors.mjs";import{$ as u,A as d,B as p,C as m,D as h,E as g,F as _,G as v,H as y,I as b,J as x,K as S,L as w,M as T,N as E,O as D,P as ee,Q as te,R as k,S as A,T as ne,U as j,V as re,W as ie,X as ae,Y as oe,Z as se,_ as M,_t as ce,a as le,at as ue,b as de,c as fe,ct as pe,d as me,dt as N,et as he,f as ge,ft as _e,g as ve,gt as ye,h as be,ht as xe,i as Se,it as Ce,j as we,k as Te,l as Ee,lt as P,m as De,mt as Oe,n as ke,nt as Ae,o as je,ot as F,p as Me,pt as Ne,q as Pe,r as Fe,rt as Ie,s as Le,st as Re,t as ze,tt as I,u as Be,ut as Ve,v as He,vt as Ue,w as We,x as Ge,y as Ke,z as qe}from"./libs/remeda.mjs";import{t as Je}from"./libs/chroma-js.mjs";import{a as Ye,i as Xe,n as Ze,o as Qe,r as $e,s as et,t as L}from"./libs/mnemonist.mjs";import{n as tt,t as nt}from"./libs/graphology-dag.mjs";import{n as rt,t as it}from"./libs/hast-util-sanitize.mjs";import{t as at}from"./libs/hast-util-to-html.mjs";import{n as ot,t as st}from"./libs/mdast-util-gfm.mjs";import{c as ct,t as lt}from"./libs/mdast-util-from-markdown.mjs";import{t as ut}from"./libs/micromark-extension-gfm.mjs";import{t as dt}from"./libs/remark-github-blockquote-alert.mjs";import{t as ft}from"./libs/remark-rehype.mjs";import{t as pt}from"./libs/unified.mjs";import{n as mt,t as ht}from"./libs/merge-error-cause.mjs";import{n as gt,t as _t}from"./libs/immer.mjs";import{a as vt,i as yt,n as bt,r as xt,t as St}from"./libs/@logtape/logtape.mjs";import{a as Ct,i as wt,n as Tt,r as Et,t as Dt}from"./libs/@lume/kiwi.mjs";import{t as Ot}from"./libs/@ts-graphviz/core.mjs";import{n as kt,r as At,t as jt}from"./libs/@ts-graphviz/ast.mjs";import{n as Mt,r as Nt,t as Pt}from"./libs/khroma.mjs";import{t as Ft}from"./libs/graphology.mjs";import{t as It}from"./libs/p-queue.mjs";import{n as Lt,t as Rt}from"./libs/nano-spawn.mjs";import{t as zt}from"./libs/which.mjs";import{$ as Bt,A as Vt,B as Ht,C as Ut,D as Wt,E as Gt,F as Kt,G as qt,H as R,I as Jt,J as Yt,K as Xt,L as Zt,M as Qt,N as $t,O as en,P as tn,Q as nn,R as rn,S as an,T as on,U as sn,V as cn,W as ln,X as un,Y as dn,Z as fn,_ as pn,_t as mn,a as hn,at as gn,b as _n,c as vn,ct as yn,d as bn,dt as xn,et as Sn,f as Cn,ft as wn,g as Tn,gt as En,h as Dn,ht as On,i as kn,it as An,j as jn,k as Mn,l as Nn,lt as Pn,m as Fn,mt as In,n as Ln,nt as Rn,o as zn,ot as Bn,p as Vn,pt as Hn,q as Un,r as Wn,rt as Gn,s as Kn,st as qn,t as Jn,tt as Yn,u as Xn,ut as Zn,v as Qn,vt as $n,w as er,x as tr,y as nr,yt as rr,z as ir}from"./libs/langium.mjs";import{t as ar}from"./libs/json5.mjs";import{$ as or,Q as sr,X as cr,Y as z,at as lr,ct as ur,et as dr,it as fr,lt as pr,n as mr,nt as hr,ot as gr,r as _r,rt as vr,st as yr,t as br,tt as xr,ut as Sr,vt as Cr}from"./libs/@hono/mcp.mjs";import{n as wr,t as Tr}from"./libs/fdir.mjs";import{t as Er}from"./libs/chokidar.mjs";import{t as Dr}from"./libs/pretty-ms.mjs";import{t as Or}from"./libs/pathe.mjs";import{a as kr,c as Ar,d as jr,i as Mr,l as Nr,n as Pr,o as Fr,r as Ir,s as Lr,t as Rr,u as zr}from"./libs/ufo.mjs";import{n as Br,t as Vr}from"./libs/unstorage.mjs";import{a as Hr,c as Ur,d as Wr,f as V,h as Gr,i as H,l as U,m as Kr,n as qr,o as Jr,p as Yr,r as Xr,s as Zr,t as Qr,u as W}from"./libs/@modelcontextprotocol/sdk.mjs";import{t as $r}from"./libs/hono.mjs";import{t as ei}from"./libs/@hono/node-server.mjs";import{createHash as ti}from"node:crypto";import{basename as ni,dirname as ri,relative as ii,resolve as ai}from"node:path";import{cwd as oi}from"node:process";import{Graphviz as si}from"@hpcc-js/wasm-graphviz";import*as ci from"node:fs/promises";import{unlink as li,writeFile as ui}from"node:fs/promises";import di from"node:os";import{mkdirSync as fi,statSync as pi}from"node:fs";import{isColorSupported as mi,isDevelopment as hi}from"std-env";import{bundleRequire as gi}from"bundle-require";import{formatMessagesSync as _i}from"esbuild";const vi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},yi={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},bi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},xi={primary:vi,blue:vi,secondary:yi,sky:yi,muted:bi,slate:bi,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`}},Si={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Ci={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},wi={line:`#3b82f6`,labelBg:`#172554`,label:`#eff5fd`},Ti={line:`#0ea5e9`,labelBg:`#082f49`,label:`#d4f2ff`},Ei={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:wi,gray:Si,green:{line:`#15803d`,labelBg:`#052e16`,label:`#bbfcd3`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#cbd0fd`},muted:Ci,primary:wi,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#fcd9d2`},secondary:Ti,sky:Ti,slate:Ci},Di={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}};var Oi=c();const ki=[`xs`,`sm`,`md`,`lg`,`xl`],Ai=[`left`,`right`,`top`,`bottom`],ji=[`solid`,`dashed`,`dotted`,`none`],Mi=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Ni=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Pi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Fi={tomato:Oi.tomato.tomato9,grass:Oi.grass.grass9,blue:Oi.blue.blue9,ruby:Oi.ruby.ruby9,orange:Oi.orange.orange9,indigo:Oi.indigo.indigo9,pink:Oi.pink.pink9,teal:Oi.teal.teal9,purple:Oi.purple.purple9,amber:Oi.amber.amber9,crimson:Oi.crimson.crimson9,red:Oi.red.red9,lime:Oi.lime.lime9,yellow:Oi.yellow.yellow9,violet:Oi.violet.violet9};function isDefaultTagColor(e){return e in Fi}const Ii={colors:Ni.reduce((e,t)=>(e[t]={elements:xi[t],relationships:Ei[t]},e),{}),...Di}
1
+ import{a as e,n as t,r,t as s}from"./rolldown-runtime.mjs";import{$ as c,A as u,B as d,C as p,D as m,E as h,F as g,G as _,H as v,I as y,J as b,K as ee,L as te,M as x,N as S,O as w,P as ne,Q as re,R as ie,S as T,St as ae,T as oe,U as se,V as ce,W as E,X as le,Y as ue,Z as de,_ as D,_t as fe,a as pe,at as me,b as he,bt as ge,c as _e,ct as ve,d as ye,dt as be,et as xe,f as Se,ft as Ce,g as we,gt as Te,h as Ee,ht as k,i as De,it as A,j as Oe,k as ke,l as Ae,lt as je,m as Me,mt as Ne,n as Pe,nt as Fe,o as Ie,ot as Le,p as Re,pt as j,q as ze,r as Be,rt as Ve,s as He,st as Ue,t as We,tt as Ge,u as Ke,ut as M,v as qe,vt as Je,w as Ye,x as Xe,xt as Ze,y as Qe,yt as $e,z as N}from"./libs/remeda.mjs";import{t as et}from"./libs/@radix-ui/colors.mjs";import{t as tt}from"./libs/chroma-js.mjs";import{a as nt,i as rt,n as it,o as at,r as ot,s as st,t as P}from"./libs/mnemonist.mjs";import{n as ct,t as lt}from"./libs/graphology-dag.mjs";import{n as ut,t as dt}from"./libs/hast-util-sanitize.mjs";import{t as ft}from"./libs/hast-util-to-html.mjs";import{n as pt,t as mt}from"./libs/mdast-util-gfm.mjs";import{c as ht,t as gt}from"./libs/mdast-util-from-markdown.mjs";import{t as _t}from"./libs/micromark-extension-gfm.mjs";import{t as vt}from"./libs/remark-github-blockquote-alert.mjs";import{t as yt}from"./libs/remark-rehype.mjs";import{t as bt}from"./libs/unified.mjs";import{n as xt,t as St}from"./libs/merge-error-cause.mjs";import{n as Ct,t as wt}from"./libs/immer.mjs";import{a as Tt,i as Et,n as Dt,r as Ot,t as kt}from"./libs/@logtape/logtape.mjs";import{t as At}from"./libs/@ts-graphviz/core.mjs";import{n as jt,r as Mt,t as Nt}from"./libs/@ts-graphviz/ast.mjs";import{n as Pt,r as Ft,t as It}from"./libs/khroma.mjs";import{t as Lt}from"./libs/graphology.mjs";import{t as Rt}from"./libs/p-queue.mjs";import{n as zt,t as Bt}from"./libs/nano-spawn.mjs";import{$ as Vt,A as Ht,B as Ut,C as Wt,D as Gt,E as Kt,F as qt,G as Jt,H as Yt,I as Xt,J as Zt,K as Qt,L as $t,M as en,N as tn,O as nn,P as rn,Q as an,R as on,S as sn,T as cn,U as ln,V as un,W as dn,X as fn,Y as pn,Z as mn,_ as hn,a as gn,at as _n,b as vn,c as yn,ct as bn,d as xn,dt as Sn,et as Cn,f as wn,ft as Tn,g as En,h as Dn,i as On,it as kn,j as An,k as jn,l as Mn,lt as Nn,m as Pn,mt as Fn,n as In,nt as Ln,o as Rn,ot as zn,p as Bn,pt as Vn,q as Hn,r as Un,rt as Wn,s as Gn,st as Kn,t as qn,tt as Jn,u as Yn,ut as Xn,v as Zn,w as Qn,x as $n,y as er,z as tr}from"./libs/langium.mjs";import{$ as F,Q as nr,X as rr,Y as I,at as ir,bt as ar,ct as or,dt as L,et as sr,ft as cr,it as lr,lt as R,n as ur,nt as dr,ot as z,r as fr,rt as pr,st as mr,t as hr,tt as gr,ut as _r}from"./libs/@hono/mcp.mjs";import{t as vr}from"./libs/pretty-ms.mjs";import{a as yr,c as br,d as xr,i as Sr,l as Cr,n as wr,o as Tr,r as Er,s as Dr,t as Or,u as kr}from"./libs/ufo.mjs";import{t as Ar}from"./libs/pathe.mjs";import{t as jr}from"./libs/picomatch.mjs";import{t as Mr}from"./libs/chokidar.mjs";import{n as Nr,t as Pr}from"./libs/unstorage.mjs";import{a as Fr,c as Ir,d as Lr,f as V,h as Rr,i as H,l as U,m as zr,n as Br,o as Vr,p as Hr,r as Ur,s as Wr,t as Gr,u as W}from"./libs/@modelcontextprotocol/sdk.mjs";import{t as Kr}from"./libs/hono.mjs";import{t as qr}from"./libs/@hono/node-server.mjs";import{createHash as Jr}from"node:crypto";import{basename as Yr,dirname as Xr,relative as Zr,resolve as Qr}from"node:path";import{cwd as $r}from"node:process";import*as ei from"@lume/kiwi";import{Graphviz as ti}from"@hpcc-js/wasm-graphviz";import*as ni from"node:fs/promises";import{unlink as ri,writeFile as ii}from"node:fs/promises";import ai from"node:os";import oi from"which";import{DocumentHighlight as si,DocumentHighlightKind as ci}from"vscode-languageserver";import{DiagnosticSeverity as li,Position as ui,TextEdit as di}from"vscode-languageserver-protocol";import{isColorSupported as fi,isDevelopment as pi}from"std-env";import mi from"json5";import{bundleRequire as hi}from"bundle-require";import{formatMessagesSync as gi}from"esbuild";import{fdir as _i}from"fdir";import{mkdirSync as vi,statSync as yi}from"node:fs";import{NotificationType as bi,NotificationType0 as xi,RequestType as Si,RequestType0 as Ci}from"vscode-jsonrpc";const wi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},Ti={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},Ei={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},Di={primary:wi,blue:wi,secondary:Ti,sky:Ti,muted:Ei,slate:Ei,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`}},Oi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},ki={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Ai={line:`#3b82f6`,labelBg:`#172554`,label:`#eff5fd`},ji={line:`#0ea5e9`,labelBg:`#082f49`,label:`#d4f2ff`},Mi={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Ai,gray:Oi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#bbfcd3`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#cbd0fd`},muted:ki,primary:Ai,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#fcd9d2`},secondary:ji,sky:ji,slate:ki},Ni={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}};var Pi=et();const Fi=[`xs`,`sm`,`md`,`lg`,`xl`],Ii=[`left`,`right`,`top`,`bottom`],Li=[`solid`,`dashed`,`dotted`,`none`],Ri=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],zi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Bi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Vi={tomato:Pi.tomato.tomato9,grass:Pi.grass.grass9,blue:Pi.blue.blue9,ruby:Pi.ruby.ruby9,orange:Pi.orange.orange9,indigo:Pi.indigo.indigo9,pink:Pi.pink.pink9,teal:Pi.teal.teal9,purple:Pi.purple.purple9,amber:Pi.amber.amber9,crimson:Pi.crimson.crimson9,red:Pi.red.red9,lime:Pi.lime.lime9,yellow:Pi.yellow.yellow9,violet:Pi.violet.violet9};function isDefaultTagColor(e){return typeof e==`string`&&e in Vi}const Hi={colors:zi.reduce((e,t)=>(e[t]={elements:Di[t],relationships:Mi[t]},e),{}),...Ni}
2
2
  /*
3
3
  * @version 1.4.0
4
4
  * @date 2015-10-26
@@ -6,60 +6,60 @@ import{c as e,i as t,r,t as s}from"./rolldown-runtime.mjs";import{t as c}from"./
6
6
  * @author Lauri Rooden (https://github.com/litejs/natural-compare-lite)
7
7
  * @license MIT License
8
8
  */
9
- ;var Li=e(s(((e,t)=>{var naturalCompare=function(e,t){var r,s,c=1,u=0,d=0,p=String.alphabet;function getCode(e,t,s){if(s){for(r=t;s=getCode(e,r),s<76&&s>65;)++r;return+e.slice(t-1,r)}return s=p&&p.indexOf(e.charAt(t)),s>-1?s+76:(s=e.charCodeAt(t)||0,s<45||s>127?s:s<46?65:s<48?s-1:s<58?s+18:s<65?s-11:s<91?s+11:s<97?s-37:s<123?s+5:s-63)}if((e+=``)!=(t+=``)){for(;c;)if(s=getCode(e,u++),c=getCode(t,d++),s<76&&c<76&&s>66&&c>66&&(s=getCode(e,u,u),c=getCode(t,d,u=r),d=r),s!=c)return s<c?-1:1}return 0};try{t.exports=naturalCompare}catch{String.naturalCompare=naturalCompare}}))(),1);function compareNatural(e,t){return e===t?0:E(e)?E(t)?(0,Li.default)(e,t):1:E(t)?-1:0}function compareNaturalHierarchically(e=`.`,t=!1){return(r,s)=>{if(r===s)return 0;if(!r)return-1;if(!s)return 1;let c=r.split(e),u=s.split(e),d=Math.min(c.length,u.length);for(let e=0;e<d;e++){let t=c[e],r=u[e],s=(0,Li.default)(t,r);if(s!==0)return s}let p=c.length-u.length;return t?-1*p:p}}function nonNullable(e,t){if(e===void 0||e==null){let r=typeof t==`function`?t():t;throw Error(r??`Expected defined value, but received ${e}`)}return e}function invariant(e,t){if(!e)throw Error(t??`Invariant failed`)}function nonexhaustive(e){throw Error(`NonExhaustive value: ${e}`)}function assignTagColors(e){let t=[],r=[];for(let[s,c]of Re(e))T(c.color)?t.push({tag:s,spec:{color:c.color}}):r.push(s);return N(r,me(compareNatural),D((e,t)=>({tag:e,spec:{color:nonNullable(Pi[t%Pi.length])}})),Ne(t),me((e,t)=>compareNatural(e.tag,t.tag)),ve(M(`tag`),M(`spec`)))}function commonHead(e,t,r){return e.length===0||t.length===0?[]:(r??=Object.is,N(ze(e,t),Le(([e,t])=>r(e,t)),D(([e,t])=>e)))}function exact(e){return We(e,e=>e===void 0)}function preferSummary(e){return e.summary??e.description}function preferDescription(e){return e.description??e.summary}function isOnStage(e,t){return e[Ri]===t}const Ri=`_stage`,zi=`_type`,Bi=`_layout`;function ProjectId(e){return e}function MarkdownOrString$1(e){return typeof e==`string`?{txt:e}:e}t(MarkdownOrString$1,`MarkdownOrString`);function flattenMarkdownOrString(e){if(y(e))return null;let t=E(e)?e:e.txt??e.md;return T(t?.trim())?t:null}function Fqn(e,t){return t?t+`.`+e:e}const Vi=`@group`;function isGroupElementKind(e){return e.kind===Vi}function ViewId(e){return e}function GlobalFqn(e,t){return invariant(typeof e==`string`&&e!=``),`@`+e+`.`+t}function isGlobalFqn(e){return e.startsWith(`@`)}function splitGlobalFqn(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 stepEdgeId(e,t){let r=`step-${String(e).padStart(2,`0`)}`;return t?`${r}.${t}`:r}function isStepEdgeId(e){return e.startsWith(`step-`)}function extractStep(e){if(!isStepEdgeId(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let G;(function(e){function isElementRef(e){return`model`in e&&!(`project`in e)}e.isElementRef=isElementRef;function isImportRef(e){return`project`in e&&`model`in e}e.isImportRef=isImportRef;function flatten(e){if(E(e))throw Error(`Expected FqnRef, got: "${e}"`);if(isImportRef(e))return GlobalFqn(e.project,e.model);if(isElementRef(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=flatten;function isModelRef(e){return isElementRef(e)||isImportRef(e)}e.isModelRef=isModelRef;function isInsideInstanceRef(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=isInsideInstanceRef;function isDeploymentElementRef(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=isDeploymentElementRef;function isDeploymentRef(e){return isDeploymentElementRef(e)||isInsideInstanceRef(e)}e.isDeploymentRef=isDeploymentRef})(G||={});let K;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&G.isModelRef(e.ref)}e.isModelRef=isModelRef;function isDeploymentRef(e){return`ref`in e&&G.isDeploymentRef(e.ref)}e.isDeploymentRef=isDeploymentRef;function isElementKindExpr(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=isElementKindExpr;function isElementTagExpr(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=isElementTagExpr;function isWhere(e){return`where`in e&&is(e.where.expr)}e.isWhere=isWhere;function isCustom(e){return`custom`in e&&(is(e.custom.expr)||isWhere(e.custom.expr))}e.isCustom=isCustom;function is(e){return isWildcard(e)||isModelRef(e)||isDeploymentRef(e)||isElementKindExpr(e)||isElementTagExpr(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.custom.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(K||={});let Hi;(function(e){function isDirect(e){return`source`in e&&`target`in e}e.isDirect=isDirect;function isIncoming(e){return`incoming`in e}e.isIncoming=isIncoming;function isOutgoing(e){return`outgoing`in e}e.isOutgoing=isOutgoing;function isInOut(e){return`inout`in e}e.isInOut=isInOut;function isWhere(e){return`where`in e&&(isDirect(e.where.expr)||isIncoming(e.where.expr)||isOutgoing(e.where.expr)||isInOut(e.where.expr))}e.isWhere=isWhere;function isCustom(e){return`customRelation`in e}e.isCustom=isCustom;function is(e){return isDirect(e)||isIncoming(e)||isOutgoing(e)||isInOut(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.customRelation.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(Hi||={});let Ui;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return Hi.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return K.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return K.is(e)||K.isWhere(e)||K.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelation(e){return Hi.is(e)||Hi.isWhere(e)||Hi.isCustom(e)}e.isRelation=isRelation})(Ui||={});let q;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&G.isModelRef(e.ref)}e.isModelRef=isModelRef;function isElementKindExpr(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=isElementKindExpr;function isElementTagExpr(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=isElementTagExpr;function isWhere(e){return`where`in e&&is(e.where.expr)}e.isWhere=isWhere;function isCustom(e){return`custom`in e&&(is(e.custom.expr)||isWhere(e.custom.expr))}e.isCustom=isCustom;function is(e){return isWildcard(e)||isModelRef(e)||isElementKindExpr(e)||isElementTagExpr(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.custom.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(q||={});let Wi;(function(e){function isDirect(e){return`source`in e&&`target`in e}e.isDirect=isDirect;function isIncoming(e){return`incoming`in e}e.isIncoming=isIncoming;function isOutgoing(e){return`outgoing`in e}e.isOutgoing=isOutgoing;function isInOut(e){return`inout`in e}e.isInOut=isInOut;function isWhere(e){return`where`in e&&(isDirect(e.where.expr)||isIncoming(e.where.expr)||isOutgoing(e.where.expr)||isInOut(e.where.expr))}e.isWhere=isWhere;function isCustom(e){return`customRelation`in e}e.isCustom=isCustom;function is(e){return isDirect(e)||isIncoming(e)||isOutgoing(e)||isInOut(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.customRelation.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(Wi||={});let Gi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return Wi.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return q.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return q.is(e)||q.isWhere(e)||q.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelationExpr(e){return Wi.is(e)||Wi.isWhere(e)||Wi.isCustom(e)}e.isRelationExpr=isRelationExpr})(Gi||={});function isDeploymentNode$1(e){return T(e.kind)&&!T(e.element)}t(isDeploymentNode$1,`isDeploymentNode`);function isPlainObject(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)===`[object Module]`:!0}function _defu(e,t,r=`.`,s){if(!isPlainObject(t))return _defu(e,{},r,s);let c={...t};for(let t of Object.keys(e)){if(t===`__proto__`||t===`constructor`)continue;let u=e[t];u!=null&&(s&&s(c,t,u,r)||(Array.isArray(u)&&Array.isArray(c[t])?c[t]=[...u,...c[t]]:isPlainObject(u)&&isPlainObject(c[t])?c[t]=_defu(u,c[t],(r?`${r}.`:``)+t.toString(),s):c[t]=u))}return c}function createDefu(e){return(...t)=>t.reduce((t,r)=>_defu(t,r,``,e),{})}const Ki=createDefu();function computeCompoundColorValues(e,t){let r=t??6,s=Je(e.fill),c=Je(e.stroke),u=s.luminance()>.8,d=N(ze(Je.scale(u?[s.darken(.02).desaturate(.05),s.darken(.1).desaturate(.1)]:[s.shade(.12,`lch`).desaturate(.05),s.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(r,null),Je.scale(u?[c.darken(.04).desaturate(.05),c.darken(.12).desaturate(.1)]:[c.shade(.15,`lch`).desaturate(.08),c.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(r,null)),D(([t,r])=>({...e,fill:t.hex(),stroke:r.hex()})));return invariant(d.length===r,`Expected ${r} colors, got ${d.length}`),d}const qi={theme:Ii,defaults:{color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}}};var Ji=class LikeC4Styles{config;customCss;theme;defaults;static DEFAULT=new LikeC4Styles(qi);static from(e,t){if(!e&&!t)return this.DEFAULT;let{customCss:r,theme:s,defaults:c}={...e},u=Ki({theme:s},{defaults:{...c}},{theme:{colors:{...t}}},qi);return y(r?.content)&&oe(u,qi)?this.DEFAULT:new LikeC4Styles(u,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get fingerprint(){return memoizeProp(this,`fingerprint`,()=>objectHash({config:this.config,customCss:this.customCss}))}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 memoizeProp(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 Ze.default(e=>new L.default(t=>computeCompoundColorValues(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=ensureSizes(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(!Je.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return computeColorValues(e)}equals(e){return e===this?!0:this.constructor===e.constructor?this.fingerprint===e.fingerprint:!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:isDefaultTagColor(e)?this.computeFrom(Fi[e]).elements:this.computeFrom(e).elements}};function ensureSizes({size:e,padding:t,textSize:r,iconSize:s,...c},u=qi.defaults.size){return e??=u,r??=e,t??=e,s??=e,{...c,size:e,padding:t,textSize:r,iconSize:s}}function isTagEqual(e){return`tag`in e}function isKindEqual(e){return`kind`in e}function isMetadataEqual(e){return`metadata`in e}function isParticipantOperator(e){return`participant`in e}function isNotOperator(e){return`not`in e}function isAndOperator(e){return`and`in e}function isOrOperator(e){return`or`in e}function whereOperatorAsPredicate(e){switch(!0){case isParticipantOperator(e):{let t=e.participant;return participantIs(t,whereOperatorAsPredicate(e.operator))}case isTagEqual(e):{if(E(e.tag)||`eq`in e.tag){let t=E(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 isKindEqual(e):{if(E(e.kind)||`eq`in e.kind){let t=E(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>k(e.kind)||e.kind!==t}case isMetadataEqual(e):{let{key:t,value:r}=e.metadata;if(r===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(E(r)||`eq`in r){let e=E(r)?r:r.eq;return r=>{if(!r.metadata)return!1;let s=r.metadata[t];return Array.isArray(s)?s.includes(e):s===e}}let s=r.neq;return e=>{if(!e.metadata)return!0;let r=e.metadata[t];return r==null?!0:Array.isArray(r)?!r.includes(s):r!==s}}case isNotOperator(e):return qe(whereOperatorAsPredicate(e.not));case isAndOperator(e):return ce(e.and.map(whereOperatorAsPredicate));case isOrOperator(e):return ye(e.or.map(whereOperatorAsPredicate));default:nonexhaustive(e)}}function participantIs(e,t){return r=>{if(!r.source||!r.target)return!1;switch(e){case`source`:return t(r.source);case`target`:return t(r.target)}}}function isViewRulePredicate$1(e){return`include`in e||`exclude`in e}t(isViewRulePredicate$1,`isViewRulePredicate`);function isViewRuleStyle$1(e){return`targets`in e&&`style`in e}t(isViewRuleStyle$1,`isViewRuleStyle`);function isElementView$1(e){return e._type===`element`}t(isElementView$1,`isElementView`);function isExtendsElementView(e){return isElementView$1(e)&&T(e.extends)}function isDeploymentView$1(e){return e._type===`deployment`}t(isDeploymentView$1,`isDeploymentView`);function isDynamicView$1(e){return e._type===`dynamic`}t(isDynamicView$1,`isDynamicView`);function isViewRuleGlobalStyle$1(e){return`styleId`in e}t(isViewRuleGlobalStyle$1,`isViewRuleGlobalStyle`);function isViewRuleGlobalPredicateRef$1(e){return`predicateId`in e}t(isViewRuleGlobalPredicateRef$1,`isViewRuleGlobalPredicateRef`);function isViewRuleAutoLayout$1(e){return`direction`in e}t(isViewRuleAutoLayout$1,`isViewRuleAutoLayout`);function getParallelStepsPrefix(e){return isStepEdgeId(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function isDynamicStepsParallel(e){return!!e&&`__parallel`in e&&S(e.__parallel)}function isDynamicStepsSeries(e){return!!e&&`__series`in e&&S(e.__series)}function isViewRuleGroup$1(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}t(isViewRuleGroup$1,`isViewRuleGroup`);function isViewRuleRank$1(e){return`rank`in e&&Array.isArray(e.targets)}t(isViewRuleRank$1,`isViewRuleRank`);const Yi=Symbol.for(`text`),Xi=Symbol.for(`html`);var Zi=class RichText{static mdcache=new Xe.default(500);static txtcache=new Xe.default(500);static getOrCreateFromText(e){if(e=e.trimEnd(),e===``)return RichText.EMPTY;let t=RichText.txtcache.get(e);return t||(t=new RichText({txt:e}),RichText.txtcache.set(e,t),t)}static getOrCreateFromMarkdown(e){if(e=e.trimEnd(),e===``)return RichText.EMPTY;let t=RichText.mdcache.get(e);return t||(t=new RichText({md:e}),RichText.mdcache.set(e,t),t)}static memoize(e,t,r){return memoizeProp(e,t,()=>RichText.from(r))}static from(e){return e==null||e===RichText.EMPTY?RichText.EMPTY:e instanceof RichText?e:typeof e==`string`?this.getOrCreateFromText(e):`isEmpty`in e&&e.isEmpty?RichText.EMPTY:`md`in e?this.getOrCreateFromMarkdown(e.md):this.getOrCreateFromText(e.txt)}static EMPTY=new class extends RichText{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:memoizeProp(this,Yi,()=>markdownToText(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;nonexhaustive(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:memoizeProp(this,Xi,()=>markdownToHtml(e.md))}equals(e){return this===e?!0:e instanceof RichText?this.isEmpty&&e.isEmpty?!0:this.isEmpty!==e.isEmpty||this.isMarkdown!==e.isMarkdown?!1:this.isMarkdown?this.$source?.md===e.$source?.md:this.$source?.txt===e.$source?.txt:!1}};function isString(e){return e!=null&&typeof e==`string`}function isNonEmptyArray(e){return!!e&&Array.isArray(e)&&e.length>0}function _hasProp(e,t){return invariant(typeof t==`string`,`Path must be string`),typeof e==`object`&&!!e&&e[t]!=null}function hasPropCurried(e){return t=>_hasProp(t,e)}function hasProp(...e){if(e.length===1&&typeof e[0]==`string`)return hasPropCurried(e[0]);let[t,r]=e;return _hasProp(t,r)}function isAnyOf(...e){return(t=>e.some(e=>e(t)))}function parentFqn(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function nameFromFqn(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const asString=e=>isString(e)?e:e.id;function isAncestor(e,t){let r=asString(e);return t?asString(t).startsWith(r+`.`):e=>{let t=asString(e);return r.startsWith(t+`.`)}}function isSameHierarchy(e,t){if(!t)return t=>isSameHierarchy(e,t);let r=asString(e),s=asString(t);return r===s||s.startsWith(r+`.`)||r.startsWith(s+`.`)}function isDescendantOf(e,t){return t?isAncestor(t,e):t=>isAncestor(e,t)}function hierarchyLevel(e){return(isString(e)?e:e.id).split(`.`).length}function hierarchyDistance(e,t){let r=isString(e)?e:e.id,s=isString(t)?t:t.id;if(r===s)return 0;let c=hierarchyLevel(r),u=hierarchyLevel(s);if(isSameHierarchy(r,s))return Math.abs(c-u);let d=commonAncestor(r,s),p=d?hierarchyLevel(d):0;return c+u-(2*p+1)}function commonAncestor(e,t){let r=e.split(`.`);if(r.length<2)return null;let s=t.split(`.`);if(s.length<2)return null;let c=[];for(let e=0;e<Math.min(r.length,s.length)-1&&r[e]===s[e];e++)c.push(r[e]);return c.length===0?null:c.join(`.`)}function ancestorsFqn(e){let t=e.split(`.`);if(t.pop(),!P(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function compareFqnHierarchically(e,t){let r=e.split(`.`).length,s=t.split(`.`).length;switch(!0){case r>s:return 1;case r<s:return-1;default:return 0}}function compareByFqnHierarchically(e,t){return compareFqnHierarchically(e.id,t.id)}function sortByFqnHierarchically(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 findTopAncestor(e,t){let r=t;for(let t of e)t!==r&&isAncestor(t,r)&&(r=t);return r===t?null:r}function sortParentsFirst(e){let t=[],r=[...e],s;for(;s=r.shift();){let e;for(;e=findTopAncestor(r,s);)t.push(...r.splice(r.indexOf(e),1));t.push(s)}return t}function sortNaturalByFqn(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>sortNaturalByFqn(e,t)}let r=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)*r;for(let r=0;r<e.fqn.length;r++){let s=compareNatural(e.fqn[r],t.fqn[r]);if(s!==0)return s}return 0}).map(({item:e})=>e)}function getOrCreate(e,t,r){let s=e.get(t);return s||(s=r(t),e.set(t,s)),s}function isIterable(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ifilter(e,t){let r=t??e;invariant(re(r));function*_filter(e){for(let t of e)r(t)&&(yield t)}return t?_filter(e):_filter}function ifind(e,t){let r=t??e;invariant(re(r));function _find(e){for(let t of e)if(r(t))return t}return t?_find(e):_find}function iflat(e){return e?_iflat(e):_iflat}function*_iflat(e){for(let t of e)yield*t}function ihead(e){return e?_head(e):_head}function _head(e){let{value:t}=e[Symbol.iterator]().next();return t}function imap(e,t){let r=t??e;invariant(re(r));function*_map(e){for(let t of e)yield r(t)}return t?_map(e):_map}function isome(e,t){let r=t??e;invariant(re(r));function _some(e){for(let t of e)if(r(t))return!0;return!1}return t?_some(e):_some}function toArray(e){return e?Array.from(e):e=>Array.from(e)}function toSet(e){return e?new Set(e):e=>new Set(e)}function iunique(e){return e?_iunique(e):_iunique}function*_iunique(e){let t=new Set;for(let r of e)t.has(r)||(t.add(r),yield r)}function memoizeProp(e,t,r){let s=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(s)||Object.defineProperty(e,s,{enumerable:!1,writable:!1,value:r()}),e[s]}function delay(...e){let t=100;return e.length===2?t=be(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function promiseNextTick(){return Promise.resolve().then(()=>void 0)}function onNextTick(e){Promise.resolve().then(e)}const compareRelations=(e,t)=>{let r=commonAncestor(e.source.id,e.target.id),s=commonAncestor(t.source.id,t.target.id);if(r&&!s)return 1;if(!r&&s)return-1;let c=r&&s?compareFqnHierarchically(r,s):0;if(c!==0)return c;let u=compareFqnHierarchically(e.source.id,t.source.id);return u===0?compareFqnHierarchically(e.target.id,t.target.id):u},Qi=Qe.intersection,$i=Qe.symmetricDifference;function union(...e){let t=new Set;for(let r of e)for(let e of r)t.add(e);return t}function intersection(e,...t){let r=new Set;if(e.size===0)return r;let s=P(t,2)?Qi(...t):t[0];if(s.size===0)return r;for(let t of e)s.has(t)&&r.add(t);return r}function difference(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let r=new Set;for(let s of e)t.has(s)||r.add(s);return r}function equals(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function symmetricDifference(e,t){return $i(e,t)}function hasIntersection(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let r of e)if(t.has(r))return!0;return!1}function serialize(e){return typeof e==`string`?`'${e}'`:new ea().serialize(e)}const ea=function(){class o{#e=new Map;compare(e,t){let r=typeof e,s=typeof t;return r===`string`&&s===`string`?e.localeCompare(t):r===`number`&&s===`number`?e-t:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let r=e.constructor,s=r===Object||r===void 0?``:r.name;if(s!==``&&globalThis[s]===r)return this.serializeBuiltInType(s,e);if(typeof e.toJSON==`function`){let t=e.toJSON();return s+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}return this.serializeObjectEntries(s,Object.entries(e))}serializeBuiltInType(e,t){let r=this[`$`+e];if(r)return r.call(this,t);if(typeof t?.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let r=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),s=`${e}{`;for(let e=0;e<r.length;e++){let[t,c]=r[e];s+=`${this.serialize(t,!0)}:${this.serialize(c)}`,e<r.length-1&&(s+=`,`)}return s+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let r=0;r<e.length;r++)t+=this.serialize(e[r]),r<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let e of[`Error`,`RegExp`,`URL`])o.prototype[`$`+e]=function(t){return`${e}(${t})`};for(let e of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])o.prototype[`$`+e]=function(t){return`${e}[${t.join(`,`)}]`};for(let e of[`BigInt64Array`,`BigUint64Array`])o.prototype[`$`+e]=function(t){return`${e}[${t.join(`n,`)}${t.length>0?`n`:``}]`};return o}(),ta=globalThis.process?.getBuiltinModule?.(`crypto`)?.hash,na=`sha256`,ra=`base64url`;function digest(e){if(ta)return ta(na,e,ra);let t=ti(na).update(e);return globalThis.process?.versions?.webcontainer?t.digest().toString(ra):t.digest(ra)}function hash(e){return digest(serialize(e))}function objectHash(e){return invariant(typeof e==`object`&&p(e),`objectHash: value must be an object`),hash(e)}function stringHash$1(e){let t=5381,r=e.length;invariant(r>0,`stringHash: empty string`);for(let s=0;s<r;s++)t=t*33^e.charCodeAt(s);return(t>>>0).toString(36)}t(stringHash$1,`stringHash`);function rehypeSanitize(e){return function(t){return it(t,e)}}function rehypeStringify(e){let t=this,r={...t.data(`settings`),...e};t.compiler=compiler;function compiler(e){return at(e,r)}}const ia={};function remarkGfm(e){let t=this,r=e||ia,s=t.data(),c=s.micromarkExtensions||=[],u=s.fromMarkdownExtensions||=[],d=s.toMarkdownExtensions||=[];c.push(ut(r)),u.push(st()),d.push(ot(r))}function remarkParse(e){let t=this;t.parser=parser;function parser(r){return lt(r,{...t.data(`settings`),...e,extensions:t.data(`micromarkExtensions`)||[],mdastExtensions:t.data(`fromMarkdownExtensions`)||[]})}}function parser(){return pt().use(remarkParse).use(remarkGfm).use(dt).use(ft,{allowDangerousHtml:!0}).use(rehypeSanitize,Ki({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`],protocols:{src:[`data`]}},rt)).use(rehypeStringify,{allowDangerousHtml:!0})}function markdownToHtml(e){return(``+parser().processSync(e)).trim()}function markdownToText(e){return ct(lt(e),{includeHtml:!1,includeImageAlt:!1})}function adjustToneRgb(e,t){return t=Math.max(-1,Math.min(1,t)),e.map(e=>{let r=t>0?e+(255-e)*t:e*(1+t);return Math.round(Math.max(0,Math.min(255,r)))})}function adjustToneHex(e,t){return Je(adjustToneRgb(Je(e).rgb(),t)).hex()}function computeColorValues(e){invariant(Je.valid(e),`Invalid color: ${e}`);let t=e.trim(),r=getColorPalette(t.startsWith(`#`)?t:Je(t).hex());return{elements:{fill:r.el_main,stroke:r.el_secondary,hiContrast:r.el_hiContrast,loContrast:r.el_loContrast},relationships:{line:r.rel_secondary,label:r.rel_hiContrast,labelBg:r.rel_main}}}function getColorPalette(e){let t=e,r=Je(t).darken(.8).hex(),s=getContrastedColorsAPCA(t),c=s.hiContrast,u=s.loContrast,d=t;return{el_main:t,el_secondary:r,el_hiContrast:c,el_loContrast:u,rel_main:d,rel_secondary:adjustToneHex(t,-.25),rel_hiContrast:getContrastedColorsAPCA(d).hiContrast}}function getContrastedColorsAPCA(e){let t=Je(e),r=t.brighten(2),s=t.darken(2),c,u,d,p;do c=r,u=s,r=r.brighten(1),s=s.darken(1),d=Je.contrastAPCA(t,r),p=Je.contrastAPCA(t,s);while(Math.abs(d)<60&&Math.abs(p)<60&&(!oe(r,c)||!oe(s,u)));return Math.abs(d)>Math.abs(p)?{hiContrast:Je(r.brighten(.4)).hex(),loContrast:r.hex()}:{hiContrast:Je(s.darken(.4)).hex(),loContrast:s.hex()}}const aa=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function applyCachedLayout(e,t){let{nodes:r,edges:s,hasManualLayout:c,...u}=e,d=new Map(r.map(e=>[e.id,e])),p=new Map(s.map(e=>[e.id,e])),m=t.nodes.map(e=>{let t=d.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),h=t.edges.map(e=>{let t=p.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints},...e.isLabelCustomized!=null&&{isLabelCustomized:e.isLabelCustomized}}:e}),g={...t,...u,[Ri]:`layouted`,bounds:t.bounds,nodes:m,edges:h};return c?g[Bi]=`auto`:delete g[Bi],g}function buildElementNotations(e){return N(e,F(e=>!!e.notation),se(M(`notation`)),g(He(se(M(`shape`)),g(He(se(M(`color`)),g(He(D(M(`kind`)),le())),Re(),D(([e,t])=>({kinds:t,color:e})))),Re(),I(([e,t])=>t.map(({color:t,kinds:r})=>({shape:e,color:t,kinds:r}))))),Re(),I(([e,t])=>t.map(({shape:t,color:r,kinds:s})=>({title:e,shape:t,color:r,kinds:s}))),Be(M(`shape`),M(`title`),[e=>e.kinds.length,`desc`]))}const changed=(e,t)=>e===t||k(e)&&k(t)?!1:!oe(e,t);function autoApplyMetaAndStyles(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],k(t.style.border)?delete e.style.border:e.style.border=t.style.border,w(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,k(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function autoApplyIcon(e,t,r){if(changed(t.icon??`none`,e.icon??`none`)){let s=T(e.icon)&&e.icon!==`none`;switch(!0){case s&&T(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case s&&(k(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!s&&T(t.icon)&&t.icon!==`none`:return r?(e.icon=t.icon,!0):!1}}return!0}function autoApplyIconStyles(e,t,r){let s=!0;return changed(e.style.iconColor,t.style.iconColor)&&(k(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),changed(e.style.iconSize,t.style.iconSize)&&(r?k(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:s=!1),changed(e.style.iconPosition,t.style.iconPosition)&&(r?k(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:s=!1),s}function patchMarkdownOrString(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 autoApplyLabelsToLeaf(e,t,r){let s=!0;return changed(e.title,t.title)&&(r?e.title=t.title:s=!1),changed(e.description,t.description)&&(k(t.description)?delete e.description:r?e.description=patchMarkdownOrString(e.description,t.description):s=!1),changed(e.technology,t.technology)&&(k(t.technology)?delete e.technology:r?e.technology=t.technology:s=!1),s}function autoApplyLabelsToCompound(e,t,r){return e.title=t.title,k(t.description)?delete e.description:e.description=patchMarkdownOrString(e.description,t.description),k(t.technology)?delete e.technology:e.technology=t.technology,!0}function applyManualLayout(e,t){invariant(e.id===t.id,`applyManualLayout: view ids do not match`),invariant(e._stage===`layouted`,`applyManualLayout: expected layouted view`),invariant(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),invariant(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let r=new Set;e._type!==t._type&&r.add(`type-changed`);let s=applyNodesManualLayout(t.nodes,e.nodes,r),c=applyEdgesManualLayout(t.edges,e.edges,r),u=buildElementNotations(s);return gt(t,d=>{d.title=e.title??t.title,d.description=e.description??t.description,d.tags=e.tags?[...e.tags]:null,d.links=e.links?[...e.links]:null,d.sourcePath=e.sourcePath,d[Bi]=`manual`,u&&u.length>0?d.notation={nodes:u}:delete d.notation,d.nodes=_t(s),d.edges=_t(c),isDynamicView$1(e)&&d._type===`dynamic`&&(d.variant=e.variant),isElementView$1(e)&&d._type===`element`&&(e.viewOf?d.viewOf=e.viewOf:delete d.viewOf,e.extends?d.extends=e.extends:delete d.extends);let p=[...r];P(p,1)?d.drifts=p:(d.hash=e.hash,delete d.drifts)})}function applyNodesManualLayout(e,t,r){let s=new Map(t.map(e=>[e.id,e])),c=e.map(e=>{let t=s.get(e.id);return t?(s.delete(t.id),gt(e,s=>{autoApplyMetaAndStyles(s,t);let c=new Set,u=e.children.length>0,d=t.children.length>0;(changed(s.modelRef,t.modelRef)||changed(s.deploymentRef,t.deploymentRef))&&c.add(`modelRef-changed`),d&&!u&&c.add(`became-compound`),!d&&u&&c.add(`became-leaf`),changed(s.parent,t.parent)&&c.add(`parent-changed`);let p=s.width+5>=t.width&&s.height+5>=t.height;changed(s.shape,t.shape)&&(p?s.shape=t.shape:c.add(`shape-changed`)),autoApplyIconStyles(s,t,p)||c.add(`label-changed`),autoApplyIcon(s,t,p&&d===u)||c.add(`label-changed`),(u?autoApplyLabelsToCompound:autoApplyLabelsToLeaf)(s,t,p)||c.add(`label-changed`),changed(s.notes,t.notes)&&(k(t.notes)?delete s.notes:s.notes=patchMarkdownOrString(s.notes,t.notes)),changed(e.notation,t.notation)&&(s.notation=t.notation??null),u&&d&&symmetricDifference(new Set(e.children),new Set(t.children)).size>0&&c.add(`children-changed`);let m=[...c];P(m,1)?(r.add(`nodes-drift`),s.drifts=m):delete s.drifts})):(r.add(`nodes-removed`),{...e,drifts:[`removed`]})});return s.size>0&&r.add(`nodes-added`),c}function applyEdgesManualLayout(e,t,r){let s=new Map(t.map(e=>[e.id,e])),c=e.map(e=>{let t=s.get(e.id)??N(s.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&s.delete(t.id),gt(e,s=>{if(!t){s.drifts=[`removed`],r.add(`edges-removed`);return}let c=new Set,u=e.id===t.id;switch(!0){case u&&e.source==t.source&&e.target==t.target:changed(s.dir??`forward`,t.dir??`forward`)&&c.add(`direction-changed`);break;case u&&e.source==t.target&&e.target==t.source:e.source!==e.target&&c.add(`direction-changed`);break;case u:e.source!=t.source&&c.add(`source-changed`),e.target!=t.target&&c.add(`target-changed`);break;default:invariant(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),invariant(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),invariant(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),changed(s.dir??`forward`,t.dir??`forward`)&&c.add(`direction-changed`);break}if(s.color=t.color,s.line=t.line,s.navigateTo=t.navigateTo??null,s.tags=t.tags?[...t.tags]:null,changed(e.notes,t.notes)&&(k(e.notes)!==k(t.notes)&&c.add(`notes-changed`),s.notes=t.notes??e.notes),t.astPath?s.astPath=t.astPath:delete s.astPath,changed(de(e,[`label`,`description`,`technology`,`labelBBox`]),de(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:c.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:c.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(s.labelBBox.width=Math.round(t.labelBBox.width),s.labelBBox.height=Math.round(t.labelBBox.height)),changed(e.label,t.label)&&(k(t.label)!==k(e.label)&&c.add(`label-changed`),s.label=t.label??e.label),changed(e.description,t.description)&&(k(t.description)!==k(e.description)&&c.add(`label-changed`),t.description&&(s.description=patchMarkdownOrString(e.description,t.description))),changed(e.technology,t.technology)&&(k(t.technology)!==k(e.technology)&&c.add(`label-changed`),s.technology=t.technology??e.technology??null);break;default:invariant(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),invariant(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let d=[...c];P(d,1)?(r.add(`edges-drift`),s.drifts=d):delete s.drifts})});return s.size>0&&r.add(`edges-added`),c}function calcDriftsFromSnapshot(e,t){let{drifts:r,...s}=applyManualLayout(e,t);if(!r||r.length===0)return gt(e,e=>{delete e.drifts,e[Bi]=`auto`});let c=new Set;r.includes(`type-changed`)&&c.add(`type-changed`);let u=new Map(s.nodes.map(e=>[e.id,e])),d=new Map(s.edges.map(e=>[e.id,e])),p=e.nodes.map(e=>{let t=u.get(e.id);return t&&u.delete(t.id),gt(e,e=>{if(!t){c.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(c.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});u.size>0&&c.add(`nodes-removed`);let m=e.edges.map(e=>{let t=d.get(e.id)??N(d.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&d.delete(t.id),gt(e,e=>{if(!t){c.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(c.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});d.size>0&&c.add(`edges-removed`);let h=[...c];return gt(e,e=>{P(h,1)?e.drifts=h:delete e.drifts,e.nodes=_t(p),e.edges=_t(m),e[Bi]=`auto`})}function serializeValue(e,t,r,s){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let s=t.get(e);return`[Circular ${s===``?`*`:`*${s}`}]`}t.set(e,s);let c=Array.isArray(e)?[]:{};for(let[u,d]of Object.entries(e))c[u]=serializeValue(d,t,r,s===``?u:`${s}.${u}`);return t.delete(e),c}function safeStringify(e,{indentation:t,trace:r}={}){let s=serializeValue(e,new WeakMap,r,``);return JSON.stringify(s,void 0,t)}const parseStack=e=>e.split(`
9
+ ;var Ui=e(s(((e,t)=>{var naturalCompare=function(e,t){var r,s,c=1,u=0,d=0,p=String.alphabet;function getCode(e,t,s){if(s){for(r=t;s=getCode(e,r),s<76&&s>65;)++r;return+e.slice(t-1,r)}return s=p&&p.indexOf(e.charAt(t)),s>-1?s+76:(s=e.charCodeAt(t)||0,s<45||s>127?s:s<46?65:s<48?s-1:s<58?s+18:s<65?s-11:s<91?s+11:s<97?s-37:s<123?s+5:s-63)}if((e+=``)!=(t+=``)){for(;c;)if(s=getCode(e,u++),c=getCode(t,d++),s<76&&c<76&&s>66&&c>66&&(s=getCode(e,u,u),c=getCode(t,d,u=r),d=r),s!=c)return s<c?-1:1}return 0};try{t.exports=naturalCompare}catch{String.naturalCompare=naturalCompare}}))(),1);function compareNatural(e,t){return e===t?0:S(e)?S(t)?(0,Ui.default)(e,t):1:S(t)?-1:0}function compareNaturalHierarchically(e=`.`,t=!1){return(r,s)=>{if(r===s)return 0;if(!r)return-1;if(!s)return 1;let c=r.split(e),u=s.split(e),d=Math.min(c.length,u.length);for(let e=0;e<d;e++){let t=c[e],r=u[e],s=(0,Ui.default)(t,r);if(s!==0)return s}let p=c.length-u.length;return t?-1*p:p}}function nonNullable(e,t){if(e===void 0||e==null){let r=typeof t==`function`?t():t;throw Error(r??`Expected defined value, but received ${e}`)}return e}function invariant(e,t){if(!e)throw Error(t??`Invariant failed`)}function nonexhaustive(e){throw Error(`NonExhaustive value: ${e}`)}function assignTagColors(e){let t=[],r=[];for(let[s,c]of be(e))x(c.color)?t.push({tag:s,spec:{color:c.color}}):r.push(s);return k(r,ye(compareNatural),w((e,t)=>({tag:e,spec:{color:nonNullable(Bi[t%Bi.length])}})),fe(t),ye((e,t)=>compareNatural(e.tag,t.tag)),we(D(`tag`),D(`spec`)))}function commonHead(e,t,r){return e.length===0||t.length===0?[]:(r??=Object.is,k(We(e,t),He(([e,t])=>r(e,t)),w(([e,t])=>e)))}function exact(e){return Ye(e,e=>e===void 0)}function preferSummary(e){return e.summary??e.description}function preferDescription(e){return e.description??e.summary}function isOnStage(e,t){return e[Wi]===t}const Wi=`_stage`,Gi=`_type`,Ki=`_layout`;function ProjectId(e){return e}function MarkdownOrString$1(e){return typeof e==`string`?{txt:e}:e}r(MarkdownOrString$1,`MarkdownOrString`);function flattenMarkdownOrString(e){if(se(e))return null;let t=S(e)?e:e.txt??e.md;return x(t?.trim())?t:null}function Fqn(e,t){return t?t+`.`+e:e}const qi=`@group`;function isGroupElementKind(e){return e.kind===qi}function ViewId(e){return e}function GlobalFqn(e,t){return invariant(typeof e==`string`&&e!=``),`@`+e+`.`+t}function isGlobalFqn(e){return e.startsWith(`@`)}function splitGlobalFqn(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 isStepPath(e){return typeof e==`string`&&e.startsWith(`step-`)}function StepPath(...e){let t=e.filter(e=>e!==void 0&&e!==``).map((e,t)=>Array.isArray(e)&&e.length===2?(invariant(x(e[1]),`StepPath segment kind can not be empty "${e[0]}:${e[1]}"`),`${e[0].toString(10).padStart(2,`0`)}:${e[1]}`):ie(e)?e.toString(10).padStart(2,`0`):t>0&&e?.startsWith(`step-`)?e.substring(5):e);invariant(j(t,1),`StepPath must have at least one segment`);let r=t.join(`.`);return r.startsWith(`step-`)?r:`step-${r}`}let G;(function(e){function isElementRef(e){return`model`in e&&!(`project`in e)}e.isElementRef=isElementRef;function isImportRef(e){return`project`in e&&`model`in e}e.isImportRef=isImportRef;function flatten(e){if(S(e))throw Error(`Expected FqnRef, got: "${e}"`);if(isImportRef(e))return GlobalFqn(e.project,e.model);if(isElementRef(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=flatten;function isModelRef(e){return isElementRef(e)||isImportRef(e)}e.isModelRef=isModelRef;function isInsideInstanceRef(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=isInsideInstanceRef;function isDeploymentElementRef(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=isDeploymentElementRef;function isDeploymentRef(e){return isDeploymentElementRef(e)||isInsideInstanceRef(e)}e.isDeploymentRef=isDeploymentRef})(G||={});let K;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&G.isModelRef(e.ref)}e.isModelRef=isModelRef;function isDeploymentRef(e){return`ref`in e&&G.isDeploymentRef(e.ref)}e.isDeploymentRef=isDeploymentRef;function isElementKindExpr(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=isElementKindExpr;function isElementTagExpr(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=isElementTagExpr;function isWhere(e){return`where`in e&&is(e.where.expr)}e.isWhere=isWhere;function isCustom(e){return`custom`in e&&(is(e.custom.expr)||isWhere(e.custom.expr))}e.isCustom=isCustom;function is(e){return isWildcard(e)||isModelRef(e)||isDeploymentRef(e)||isElementKindExpr(e)||isElementTagExpr(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.custom.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(K||={});let Ji;(function(e){function isDirect(e){return`source`in e&&`target`in e}e.isDirect=isDirect;function isIncoming(e){return`incoming`in e}e.isIncoming=isIncoming;function isOutgoing(e){return`outgoing`in e}e.isOutgoing=isOutgoing;function isInOut(e){return`inout`in e}e.isInOut=isInOut;function isWhere(e){return`where`in e&&(isDirect(e.where.expr)||isIncoming(e.where.expr)||isOutgoing(e.where.expr)||isInOut(e.where.expr))}e.isWhere=isWhere;function isCustom(e){return`customRelation`in e}e.isCustom=isCustom;function is(e){return isDirect(e)||isIncoming(e)||isOutgoing(e)||isInOut(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.customRelation.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(Ji||={});let Yi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return Ji.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return K.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return K.is(e)||K.isWhere(e)||K.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelation(e){return Ji.is(e)||Ji.isWhere(e)||Ji.isCustom(e)}e.isRelation=isRelation})(Yi||={});let q;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&G.isModelRef(e.ref)}e.isModelRef=isModelRef;function isElementKindExpr(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=isElementKindExpr;function isElementTagExpr(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=isElementTagExpr;function isWhere(e){return`where`in e&&is(e.where.expr)}e.isWhere=isWhere;function isCustom(e){return`custom`in e&&(is(e.custom.expr)||isWhere(e.custom.expr))}e.isCustom=isCustom;function is(e){return isWildcard(e)||isModelRef(e)||isElementKindExpr(e)||isElementTagExpr(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.custom.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(q||={});let Xi;(function(e){function isDirect(e){return`source`in e&&`target`in e}e.isDirect=isDirect;function isIncoming(e){return`incoming`in e}e.isIncoming=isIncoming;function isOutgoing(e){return`outgoing`in e}e.isOutgoing=isOutgoing;function isInOut(e){return`inout`in e}e.isInOut=isInOut;function isWhere(e){return`where`in e&&(isDirect(e.where.expr)||isIncoming(e.where.expr)||isOutgoing(e.where.expr)||isInOut(e.where.expr))}e.isWhere=isWhere;function isCustom(e){return`customRelation`in e}e.isCustom=isCustom;function is(e){return isDirect(e)||isIncoming(e)||isOutgoing(e)||isInOut(e)}e.is=is;function unwrap(e){return isCustom(e)&&(e=e.customRelation.expr),isWhere(e)&&(e=e.where.expr),e}e.unwrap=unwrap})(Xi||={});let Zi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return Xi.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return q.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return q.is(e)||q.isWhere(e)||q.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelationExpr(e){return Xi.is(e)||Xi.isWhere(e)||Xi.isCustom(e)}e.isRelationExpr=isRelationExpr})(Zi||={});function isDeploymentNode$1(e){return x(e.kind)&&!x(e.element)}r(isDeploymentNode$1,`isDeploymentNode`);function isDeployedInstance$1(e){return x(e.element)&&!x(e.kind)}r(isDeployedInstance$1,`isDeployedInstance`);function isPlainObject(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)===`[object Module]`:!0}function _defu(e,t,r=`.`,s){if(!isPlainObject(t))return _defu(e,{},r,s);let c={...t};for(let t of Object.keys(e)){if(t===`__proto__`||t===`constructor`)continue;let u=e[t];u!=null&&(s&&s(c,t,u,r)||(Array.isArray(u)&&Array.isArray(c[t])?c[t]=[...u,...c[t]]:isPlainObject(u)&&isPlainObject(c[t])?c[t]=_defu(u,c[t],(r?`${r}.`:``)+t.toString(),s):c[t]=u))}return c}function createDefu(e){return(...t)=>t.reduce((t,r)=>_defu(t,r,``,e),{})}const Qi=createDefu();function computeCompoundColorValues(e,t){let r=t??6,s=tt(e.fill),c=tt(e.stroke),u=s.luminance()>.8,d=k(We(tt.scale(u?[s.darken(.02).desaturate(.05),s.darken(.1).desaturate(.1)]:[s.shade(.12,`lch`).desaturate(.05),s.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(r,null),tt.scale(u?[c.darken(.04).desaturate(.05),c.darken(.12).desaturate(.1)]:[c.shade(.15,`lch`).desaturate(.08),c.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(r,null)),w(([t,r])=>({...e,fill:t.hex(),stroke:r.hex()})));return invariant(d.length===r,`Expected ${r} colors, got ${d.length}`),d}const $i={theme:Hi,defaults:{color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}}};var ea=class LikeC4Styles{config;customCss;theme;defaults;static DEFAULT=new LikeC4Styles($i);static from(e,t){if(!e&&!t)return this.DEFAULT;let{customCss:r,theme:s,defaults:c}={...e},u=Qi({theme:s},{defaults:{...c}},{theme:{colors:{...t}}},$i);return se(r?.content)&&le(u,$i)?this.DEFAULT:new LikeC4Styles(u,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get fingerprint(){return memoizeProp(this,`fingerprint`,()=>objectHash({config:this.config,customCss:this.customCss}))}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 memoizeProp(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 it.default(e=>new P.default(t=>computeCompoundColorValues(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=ensureSizes(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(!tt.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return computeColorValues(e)}equals(e){return e===this||this.constructor===e.constructor&&this.fingerprint===e.fingerprint}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:isDefaultTagColor(e)?this.computeFrom(Vi[e]).elements:this.computeFrom(e).elements}};function ensureSizes({size:e,padding:t,textSize:r,iconSize:s,...c},u=$i.defaults.size){return e??=u,r??=e,t??=e,s??=e,{...c,size:e,padding:t,textSize:r,iconSize:s}}function isTagEqual(e){return`tag`in e}function isKindEqual(e){return`kind`in e}function isMetadataEqual(e){return`metadata`in e}function isParticipantOperator(e){return`participant`in e}function isNotOperator(e){return`not`in e}function isAndOperator(e){return`and`in e}function isOrOperator(e){return`or`in e}function whereOperatorAsPredicate(e){switch(!0){case isParticipantOperator(e):{let t=e.participant;return participantIs(t,whereOperatorAsPredicate(e.operator))}case isTagEqual(e):{if(S(e.tag)||`eq`in e.tag){let t=S(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 isKindEqual(e):{if(S(e.kind)||`eq`in e.kind){let t=S(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>N(e.kind)||e.kind!==t}case isMetadataEqual(e):{let{key:t,value:r}=e.metadata;if(r===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(S(r)||`eq`in r){let e=S(r)?r:r.eq;return r=>{if(!r.metadata)return!1;let s=r.metadata[t];return Array.isArray(s)?s.includes(e):s===e}}let s=r.neq;return e=>{if(!e.metadata)return!0;let r=e.metadata[t];return r==null?!0:Array.isArray(r)?!r.includes(s):r!==s}}case isNotOperator(e):return d(whereOperatorAsPredicate(e.not));case isAndOperator(e):return Ze(e.and.map(whereOperatorAsPredicate));case isOrOperator(e):return ge(e.or.map(whereOperatorAsPredicate));default:nonexhaustive(e)}}function participantIs(e,t){return r=>{if(!r.source||!r.target)return!1;switch(e){case`source`:return t(r.source);case`target`:return t(r.target)}}}function isViewRulePredicate$1(e){return`include`in e||`exclude`in e}r(isViewRulePredicate$1,`isViewRulePredicate`);function isViewRuleStyle$1(e){return`targets`in e&&`style`in e}r(isViewRuleStyle$1,`isViewRuleStyle`);function isElementView$1(e){return e._type===`element`}r(isElementView$1,`isElementView`);function isExtendsElementView(e){return isElementView$1(e)&&x(e.extends)}function isDeploymentView$1(e){return e._type===`deployment`}r(isDeploymentView$1,`isDeploymentView`);function isDynamicView$1(e){return e._type===`dynamic`}r(isDynamicView$1,`isDynamicView`);function isViewRuleGlobalStyle$1(e){return`styleId`in e}r(isViewRuleGlobalStyle$1,`isViewRuleGlobalStyle`);function isViewRuleGlobalPredicateRef$1(e){return`predicateId`in e}r(isViewRuleGlobalPredicateRef$1,`isViewRuleGlobalPredicateRef`);function isViewRuleAutoLayout$1(e){return`direction`in e}r(isViewRuleAutoLayout$1,`isViewRuleAutoLayout`);function isSubFlow(e){return typeof e==`object`&&!!e&&isString(e.id)&&isString(e._type)}function asStepPath(e){return isString(e)?e:e.id}const ta={isStepPath,isSubFlow,isTry:e=>isSubFlow(e)&&e._type===`try`,isTryBlock:e=>isSubFlow(e)&&ta.type.isTryBlock(e._type),isAlt:e=>isSubFlow(e)&&e._type===`alt`,isAltBranch:e=>isSubFlow(e)&&ta.type.isAltBranch(e._type),isTryBranch:e=>isSubFlow(e)&&ta.type.isTryBranch(e._type),isAltOrTry:e=>isSubFlow(e)&&ta.type.isAltOrTry(e._type),isAltOrTryBranch:e=>isSubFlow(e)&&ta.type.isAltOrTryBranch(e._type),type:{isAltOrTry:e=>e===`alt`||e===`try`,isAltBranch:e=>isString(e)&&e.startsWith(`alt-`),isTryBlock:e=>e===`try-block`,isTryBranch:e=>isString(e)&&e.startsWith(`try-`),isAltOrTryBranch:e=>isString(e)&&(e.startsWith(`alt-`)||e.startsWith(`try-`))}};function _includesStep(e,t){let r=asStepPath(e);return asStepPath(t).startsWith(r)}function includes$1(...e){return ae(_includesStep,e)}r(includes$1,`includes`);const na=compareNaturalHierarchically();function _isBefore(e,t){let r=asStepPath(e),s=asStepPath(t);return na(r,s)<=0}function isBefore(...e){return ae(_isBefore,e)}const ra={unwindTry:e=>{let[t,r=null,s=null]=e.flow;return!s&&r?._type===`try-finally`&&(s=r,r=null),{tryBlock:t,catchBlock:r?._type===`try-catch`?r:null,finallyBlock:s}},firstStep:e=>{if(isStepPath(e))return e;if(ze(e)){for(let t of e){if(isStepPath(t))return t;let e=ra.firstStep(t);if(e)return e}return null}return ra.firstStep(e.flow)},hasSteps:e=>!!ra.firstStep(e),steps:e=>M(e.flow,ta.isStepPath),subflows:e=>M(e.flow,ta.isSubFlow),hasSubflows:e=>e.flow.some(ta.isSubFlow),isBefore,includes:includes$1};function parentFlow(e){if(!e)return null;let t=e.lastIndexOf(`.`);if(t===-1)return null;let r=e.slice(0,t);return r.includes(`:`)?r:null}var StopError=class{result;constructor(e){this.result=e}};function walkthroughFlow(...e){if(e.length===1)return t=>walkthroughFlow(t,e[0]);let[t,r]=e;if(!t.flow)throw Error(`Dynamic view ${t.id} does not have a flow`);let s=1,c=new Map(t.edges.map(e=>[e.id,e])),u=new Map(t.nodes.map(e=>[e.id,e])),visitStep=(e,t,d,p)=>{let m=nonNullable(c.get(e)),h=nonNullable(u.get(m.source)),g=nonNullable(u.get(m.target));r.step?.({step:e,level:d,edge:m,source:h,target:g,stepnum:{index:p,global:s++},parent:t,stopAndReturn:t=>{throw new StopError(t??e)}})},callSubflow=e=>{if(!r.subflow)return;if(v(r.subflow))return r.subflow(e);let t=r.subflow[e.type]??r.subflow.default;return ee(t)?t:v(t)?t(e):void 0},visitSubflow=(e,t,r,s=0)=>{let c={id:e.id,type:e._type,subflow:e,parent:t,previous:r,level:s,stopAndReturn:t=>{throw new StopError(t??e)}},u=callSubflow(c)??!0;if(u===!1)return!1;let d,p;u===!0?d=e.flow:v(u)?(p=u,d=e.flow):(d=u.next?k(Array.isArray(u.next)?u.next:[u.next],M(x),w(t=>(invariant(e.flow.includes(t),`Next step must be part of the subflow`),t))):e.flow,p=u.onLeave);let m=walk(d,c,s+1);return p?.(m),!0};function walk(e,t,r=0){let s=1,c=null,u=[];for(let d of e){if(ta.isStepPath(d)){u.push(d),c=d,visitStep(d,t,r,s++);continue}visitSubflow(d,t,c,r)&&(u.push(d),c=d)}return{visited:u,lastVisited:c}}try{walk(t.flow,null,0)}catch(e){if(e instanceof StopError)return e.result;throw e}}function onSubflows(e,t){return e=Array.isArray(e)?e:[e],Object.fromEntries(w(e,e=>[e,t]))}walkthroughFlow.onSubflows=onSubflows;function dynamicViewFlow(e){return ia.from(e)}var ia=class DynamicViewFlow{static cache=new it.default(e=>new DynamicViewFlow(e));static from(e){return this.cache.get(e)}static guards=ta;static helpers=ra;unwindTry=ra.unwindTry;isBefore=ra.isBefore;includes=ra.includes;onSubflows=onSubflows;guards=ta;helpers=ra;view;levelById=new Map;byId=new Map;stepsCount;constructor(e){if(!e.flow)throw Error(`Dynamic view "${e.id}" does not have a flow, probably it is a stale snapshot`);this.view=e;let t=0;walkthroughFlow(e,{step:({step:e,level:r})=>{this.levelById.set(e,r),t++},subflow:({subflow:e,level:t})=>{this.byId.set(e.id,e),this.levelById.set(e.id,t)}}),this.stepsCount=t}get paths(){return Array.from(this.levelById.keys())}level(e){return nonNullable(this.levelById.get(isString(e)?e:e.id))}parent(e){let t=parentFlow(isString(e)?e:e.id);return t?this.lookup(t):void 0}firstStep(e){if(!e)return nonNullable(ra.firstStep(this.view.flow),`No steps found in flow`);let t=asStepPath(e);return this.isStep(t)?t:ra.firstStep(this.lookup(t))}isStep(e){return!this.byId.has(e)&&this.levelById.has(e)}isSubflow(e){return this.byId.has(e)}steps(e){return M(e?this.lookup(asStepPath(e)).flow:this.view.flow,isStepPath)}prevAndNext(e,t){invariant(!this.isSubflow(e),`${e} is a subflow, not a step`);let r=null,s=null,c=null;return walkthroughFlow(this.view,{step:({step:t,stopAndReturn:u})=>{c===e&&(s=t,u()),t===e&&(r=c),c=t},subflow:({subflow:e})=>!t?.(e.id)}),{prev:r,next:s}}lookup(e,t){let r=nonNullable(this.byId.get(e),`SubFlow "${e}" not found`);if(t&&r._type!==t)throw Error(`SubFlow "${e}" is of type "${r._type}" (expected "${t}")`);return r}subflows(e){return e?(typeof e==`string`?this.lookup(e):e).flow.filter(ta.isSubFlow):this.view.flow.filter(ta.isSubFlow)}hasSubflows(e){return(typeof e==`string`?this.byId.get(e):e)?.flow.some(ta.isSubFlow)??!1}walk(e){return walkthroughFlow(this.view,e)}stepsBefore(e){return stepsBefore(this.view,e)}stepPathsBefore(e){return stepsBefore(this.view,e).map(asStepPath)}};function stepsBefore(e,t){let r=includes$1(t),s=[];return walkthroughFlow(e,{step:({step:e,stopAndReturn:r})=>{e===t&&r(),s.push(e)},subflow:({subflow:e,stopAndReturn:c})=>e.id===t?c():(s.push(e),e._type===`alt`?{next:r(e)?je(e.flow,r):Le(e.flow,ra.hasSteps)}:e._type!==`try`||{next:r(e)?e.flow:Le(e.flow,ta.type.isTryBlock)})}),s}const aa={isStep:e=>!!e&&`source`in e&&`target`in e,isSeries:e=>!!e&&`_type`in e&&e._type===`series`,isParallel:e=>!!e&&`_type`in e&&e._type===`par`,isOpt:e=>!!e&&`_type`in e&&e._type===`opt`,isLoop:e=>!!e&&`_type`in e&&e._type===`loop`,isTry:e=>!!e&&`_type`in e&&e._type===`try`,isAlt:e=>!!e&&`_type`in e&&e._type===`alt`,isBreak:e=>!!e&&`_type`in e&&e._type===`break`};function isViewRuleGroup$1(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}r(isViewRuleGroup$1,`isViewRuleGroup`);function isViewRuleRank$1(e){return`rank`in e&&Array.isArray(e.targets)}r(isViewRuleRank$1,`isViewRuleRank`);const oa=Symbol.for(`text`),sa=Symbol.for(`html`);var ca=class RichText{static mdcache=new rt.default(500);static txtcache=new rt.default(500);static getOrCreateFromText(e){if(e=e.trimEnd(),e===``)return RichText.EMPTY;let t=RichText.txtcache.get(e);return t||(t=new RichText({txt:e}),RichText.txtcache.set(e,t),t)}static getOrCreateFromMarkdown(e){if(e=e.trimEnd(),e===``)return RichText.EMPTY;let t=RichText.mdcache.get(e);return t||(t=new RichText({md:e}),RichText.mdcache.set(e,t),t)}static memoize(e,t,r){return memoizeProp(e,t,()=>RichText.from(r))}static from(e){return e==null||e===RichText.EMPTY?RichText.EMPTY:e instanceof RichText?e:typeof e==`string`?this.getOrCreateFromText(e):`isEmpty`in e&&e.isEmpty?RichText.EMPTY:`md`in e?this.getOrCreateFromMarkdown(e.md):this.getOrCreateFromText(e.txt)}static EMPTY=new class extends RichText{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:memoizeProp(this,oa,()=>markdownToText(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;nonexhaustive(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:memoizeProp(this,sa,()=>markdownToHtml(e.md))}equals(e){return this===e?!0:e instanceof RichText?this.isEmpty&&e.isEmpty?!0:this.isEmpty!==e.isEmpty||this.isMarkdown!==e.isMarkdown?!1:this.isMarkdown?this.$source?.md===e.$source?.md:this.$source?.txt===e.$source?.txt:!1}};function isString(e){return e!=null&&typeof e==`string`}function isNonEmptyArray(e){return!!e&&Array.isArray(e)&&e.length>0}function _hasProp(e,t){return invariant(typeof t==`string`,`Path must be string`),typeof e==`object`&&!!e&&e[t]!=null}function hasPropCurried(e){return t=>_hasProp(t,e)}function hasProp(...e){if(e.length===1&&typeof e[0]==`string`)return hasPropCurried(e[0]);let[t,r]=e;return _hasProp(t,r)}function isAnyOf(...e){return(t=>e.some(e=>e(t)))}function parentFqn(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function nameFromFqn(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const asString=e=>isString(e)?e:e.id;function isAncestor(e,t){let r=asString(e);return t?asString(t).startsWith(r+`.`):e=>{let t=asString(e);return r.startsWith(t+`.`)}}function isSameHierarchy(e,t){if(!t)return t=>isSameHierarchy(e,t);let r=asString(e),s=asString(t);return r===s||s.startsWith(r+`.`)||r.startsWith(s+`.`)}function isDescendantOf(e,t){return t?isAncestor(t,e):t=>isAncestor(e,t)}function hierarchyLevel(e){return(isString(e)?e:e.id).split(`.`).length}function hierarchyDistance(e,t){let r=isString(e)?e:e.id,s=isString(t)?t:t.id;if(r===s)return 0;let c=hierarchyLevel(r),u=hierarchyLevel(s);if(isSameHierarchy(r,s))return Math.abs(c-u);let d=commonAncestor(r,s),p=d?hierarchyLevel(d):0;return c+u-(2*p+1)}function commonAncestor(e,t){let r=e.split(`.`);if(r.length<2)return null;let s=t.split(`.`);if(s.length<2)return null;let c=[];for(let e=0;e<Math.min(r.length,s.length)-1&&r[e]===s[e];e++)c.push(r[e]);return c.length===0?null:c.join(`.`)}function ancestorsFqn(e){let t=e.split(`.`);if(t.pop(),!j(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function compareFqnHierarchically(e,t){let r=e.split(`.`).length,s=t.split(`.`).length;switch(!0){case r>s:return 1;case r<s:return-1;default:return 0}}function compareByFqnHierarchically(e,t){return compareFqnHierarchically(e.id,t.id)}function sortByFqnHierarchically(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 findTopAncestor(e,t){let r=t;for(let t of e)t!==r&&isAncestor(t,r)&&(r=t);return r===t?null:r}function sortParentsFirst(e){let t=[],r=[...e],s;for(;s=r.shift();){let e;for(;e=findTopAncestor(r,s);)t.push(...r.splice(r.indexOf(e),1));t.push(s)}return t}function sortNaturalByFqn(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>sortNaturalByFqn(e,t)}let r=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)*r;for(let r=0;r<e.fqn.length;r++){let s=compareNatural(e.fqn[r],t.fqn[r]);if(s!==0)return s}return 0}).map(({item:e})=>e)}function getOrCreate(e,t,r){let s=e.get(t);return s||(s=r(t),e.set(t,s)),s}function isIterable(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ifilter(e,t){let r=t??e;invariant(v(r));function*_filter(e){for(let t of e)r(t)&&(yield t)}return t?_filter(e):_filter}function ifind(e,t){let r=t??e;invariant(v(r));function _find(e){for(let t of e)if(r(t))return t}return t?_find(e):_find}function iflat(e){return e?_iflat(e):_iflat}function*_iflat(e){for(let t of e)yield*t}function ihead(e){return e?_head(e):_head}function _head(e){let{value:t}=e[Symbol.iterator]().next();return t}function imap(e,t){let r=t??e;invariant(v(r));function*_map(e){for(let t of e)yield r(t)}return t?_map(e):_map}function isome(e,t){let r=t??e;invariant(v(r));function _some(e){for(let t of e)if(r(t))return!0;return!1}return t?_some(e):_some}function toArray(e){return e?Array.from(e):e=>Array.from(e)}function toSet(e){return e?new Set(e):e=>new Set(e)}function iunique(e){return e?_iunique(e):_iunique}function*_iunique(e){let t=new Set;for(let r of e)t.has(r)||(t.add(r),yield r)}function memoizeProp(e,t,r){let s=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(s)||Object.defineProperty(e,s,{enumerable:!1,writable:!1,value:r()}),e[s]}function delay(...e){let t=100;return e.length===2?t=Ee(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function promiseNextTick(){return Promise.resolve().then(()=>void 0)}function onNextTick(e){Promise.resolve().then(e)}const compareRelations=(e,t)=>{let r=commonAncestor(e.source.id,e.target.id),s=commonAncestor(t.source.id,t.target.id);if(r&&!s)return 1;if(!r&&s)return-1;let c=r&&s?compareFqnHierarchically(r,s):0;if(c!==0)return c;let u=compareFqnHierarchically(e.source.id,t.source.id);return u===0?compareFqnHierarchically(e.target.id,t.target.id):u},la=at.intersection,ua=at.symmetricDifference;function union(...e){let t=new Set;for(let r of e)for(let e of r)t.add(e);return t}function intersection(e,...t){let r=new Set;if(e.size===0)return r;let s=j(t,2)?la(...t):t[0];if(s.size===0)return r;for(let t of e)s.has(t)&&r.add(t);return r}function difference(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let r=new Set;for(let s of e)t.has(s)||r.add(s);return r}function equals(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function symmetricDifference(e,t){return ua(e,t)}function hasIntersection(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let r of e)if(t.has(r))return!0;return!1}function serialize(e){return typeof e==`string`?`'${e}'`:new da().serialize(e)}const da=function(){class o{#e=new Map;compare(e,t){let r=typeof e,s=typeof t;return r===`string`&&s===`string`?e.localeCompare(t):r===`number`&&s===`number`?e-t:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let r=e.constructor,s=r===Object||r===void 0?``:r.name;if(s!==``&&globalThis[s]===r)return this.serializeBuiltInType(s,e);if(typeof e.toJSON==`function`){let t=e.toJSON();return s+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}return this.serializeObjectEntries(s,Object.entries(e))}serializeBuiltInType(e,t){let r=this[`$`+e];if(r)return r.call(this,t);if(typeof t?.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let r=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),s=`${e}{`;for(let e=0;e<r.length;e++){let[t,c]=r[e];s+=`${this.serialize(t,!0)}:${this.serialize(c)}`,e<r.length-1&&(s+=`,`)}return s+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let r=0;r<e.length;r++)t+=this.serialize(e[r]),r<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let e of[`Error`,`RegExp`,`URL`])o.prototype[`$`+e]=function(t){return`${e}(${t})`};for(let e of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])o.prototype[`$`+e]=function(t){return`${e}[${t.join(`,`)}]`};for(let e of[`BigInt64Array`,`BigUint64Array`])o.prototype[`$`+e]=function(t){return`${e}[${t.join(`n,`)}${t.length>0?`n`:``}]`};return o}(),fa=globalThis.process?.getBuiltinModule?.(`crypto`)?.hash,pa=`sha256`,ma=`base64url`;function digest(e){if(fa)return fa(pa,e,ma);let t=Jr(pa).update(e);return globalThis.process?.versions?.webcontainer?t.digest().toString(ma):t.digest(ma)}function hash(e){return digest(serialize(e))}function objectHash(e){return invariant(typeof e==`object`&&ce(e),`objectHash: value must be an object`),hash(e)}function stringHash$1(e){let t=5381,r=e.length;invariant(r>0,`stringHash: empty string`);for(let s=0;s<r;s++)t=t*33^e.charCodeAt(s);return(t>>>0).toString(36)}r(stringHash$1,`stringHash`);function rehypeSanitize(e){return function(t){return dt(t,e)}}function rehypeStringify(e){let t=this,r={...t.data(`settings`),...e};t.compiler=compiler;function compiler(e){return ft(e,r)}}const ha={};function remarkGfm(e){let t=this,r=e||ha,s=t.data(),c=s.micromarkExtensions||=[],u=s.fromMarkdownExtensions||=[],d=s.toMarkdownExtensions||=[];c.push(_t(r)),u.push(mt()),d.push(pt(r))}function remarkParse(e){let t=this;t.parser=parser;function parser(r){return gt(r,{...t.data(`settings`),...e,extensions:t.data(`micromarkExtensions`)||[],mdastExtensions:t.data(`fromMarkdownExtensions`)||[]})}}function parser(){return bt().use(remarkParse).use(remarkGfm).use(vt).use(yt,{allowDangerousHtml:!0}).use(rehypeSanitize,Qi({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`],protocols:{src:[`data`]}},ut)).use(rehypeStringify,{allowDangerousHtml:!0})}function markdownToHtml(e){return(``+parser().processSync(e)).trim()}function markdownToText(e){return ht(gt(e),{includeHtml:!1,includeImageAlt:!1})}function adjustToneRgb(e,t){return t=Math.max(-1,Math.min(1,t)),e.map(e=>{let r=t>0?e+(255-e)*t:e*(1+t);return Math.round(Math.max(0,Math.min(255,r)))})}function adjustToneHex(e,t){return tt(adjustToneRgb(tt(e).rgb(),t)).hex()}function computeColorValues(e){invariant(tt.valid(e),`Invalid color: ${e}`);let t=e.trim(),r=getColorPalette(t.startsWith(`#`)?t:tt(t).hex());return{elements:{fill:r.el_main,stroke:r.el_secondary,hiContrast:r.el_hiContrast,loContrast:r.el_loContrast},relationships:{line:r.rel_secondary,label:r.rel_hiContrast,labelBg:r.rel_main}}}function getColorPalette(e){let t=e,r=tt(t).darken(.8).hex(),s=getContrastedColorsAPCA(t),c=s.hiContrast,u=s.loContrast,d=t;return{el_main:t,el_secondary:r,el_hiContrast:c,el_loContrast:u,rel_main:d,rel_secondary:adjustToneHex(t,-.25),rel_hiContrast:getContrastedColorsAPCA(d).hiContrast}}function getContrastedColorsAPCA(e){let t=tt(e),r=t.brighten(2),s=t.darken(2),c,u,d,p;do c=r,u=s,r=r.brighten(1),s=s.darken(1),d=tt.contrastAPCA(t,r),p=tt.contrastAPCA(t,s);while(Math.abs(d)<60&&Math.abs(p)<60&&(!le(r,c)||!le(s,u)));return Math.abs(d)>Math.abs(p)?{hiContrast:tt(r.brighten(.4)).hex(),loContrast:r.hex()}:{hiContrast:tt(s.darken(.4)).hex(),loContrast:s.hex()}}const ga=[`dashed`,`solid`,`dotted`],_a=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function applyCachedLayout(e,t){let{nodes:r,edges:s,hasManualLayout:c,...u}=e,d=new Map(r.map(e=>[e.id,e])),p=new Map(s.map(e=>[e.id,e])),m=t.nodes.map(e=>{let t=d.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),h=t.edges.map(e=>{let t=p.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints},...e.isLabelCustomized!=null&&{isLabelCustomized:e.isLabelCustomized}}:e}),g={...t,...u,[Wi]:`layouted`,bounds:t.bounds,nodes:m,edges:h};return c?g[Ki]=`auto`:delete g[Ki],g}function buildElementNotations(e){return k(e,M(e=>!!e.notation),re(D(`notation`)),h(qe(re(D(`shape`)),h(qe(re(D(`color`)),h(qe(w(D(`kind`)),pe())),be(),w(([e,t])=>({kinds:t,color:e})))),be(),A(([e,t])=>t.map(({color:t,kinds:r})=>({shape:e,color:t,kinds:r}))))),be(),A(([e,t])=>t.map(({shape:t,color:r,kinds:s})=>({title:e,shape:t,color:r,kinds:s}))),Ke(D(`shape`),D(`title`),[e=>e.kinds.length,`desc`]))}const changed=(e,t)=>e===t||N(e)&&N(t)?!1:!le(e,t);function autoApplyMetaAndStyles(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],N(t.style.border)?delete e.style.border:e.style.border=t.style.border,ie(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,N(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function autoApplyIcon(e,t,r){if(changed(t.icon??`none`,e.icon??`none`)){let s=x(e.icon)&&e.icon!==`none`;switch(!0){case s&&x(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case s&&(N(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!s&&x(t.icon)&&t.icon!==`none`:return r?(e.icon=t.icon,!0):!1}}return!0}function autoApplyIconStyles(e,t,r){let s=!0;return changed(e.style.iconColor,t.style.iconColor)&&(N(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),changed(e.style.iconSize,t.style.iconSize)&&(r?N(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:s=!1),changed(e.style.iconPosition,t.style.iconPosition)&&(r?N(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:s=!1),s}function patchMarkdownOrString(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 autoApplyLabelsToLeaf(e,t,r){let s=!0;return changed(e.title,t.title)&&(r?e.title=t.title:s=!1),changed(e.description,t.description)&&(N(t.description)?delete e.description:r?e.description=patchMarkdownOrString(e.description,t.description):s=!1),changed(e.technology,t.technology)&&(N(t.technology)?delete e.technology:r?e.technology=t.technology:s=!1),s}function autoApplyLabelsToCompound(e,t,r){return e.title=t.title,N(t.description)?delete e.description:e.description=patchMarkdownOrString(e.description,t.description),N(t.technology)?delete e.technology:e.technology=t.technology,!0}function applyManualLayout(e,t){invariant(e.id===t.id,`applyManualLayout: view ids do not match`),invariant(e._stage===`layouted`,`applyManualLayout: expected layouted view`),invariant(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),invariant(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let r=new Set;e._type!==t._type&&r.add(`type-changed`);let s=applyNodesManualLayout(t.nodes,e.nodes,r),c=applyEdgesManualLayout(t.edges,e.edges,r),u=buildElementNotations(s);return Ct(t,d=>{d.title=e.title??t.title,d.description=e.description??t.description,d.tags=e.tags?[...e.tags]:null,d.links=e.links?[...e.links]:null,d.sourcePath=e.sourcePath,d[Ki]=`manual`,u&&u.length>0?d.notation={nodes:u}:delete d.notation,d.nodes=wt(s),d.edges=wt(c),isDynamicView$1(e)&&d._type===`dynamic`&&(d.variant=e.variant),isElementView$1(e)&&d._type===`element`&&(e.viewOf?d.viewOf=e.viewOf:delete d.viewOf,e.extends?d.extends=e.extends:delete d.extends);let p=[...r];j(p,1)?d.drifts=p:(d.hash=e.hash,delete d.drifts)})}function applyNodesManualLayout(e,t,r){let s=new Map(t.map(e=>[e.id,e])),c=e.map(e=>{let t=s.get(e.id);return t?(s.delete(t.id),Ct(e,s=>{autoApplyMetaAndStyles(s,t);let c=new Set,u=e.children.length>0,d=t.children.length>0;(changed(s.modelRef,t.modelRef)||changed(s.deploymentRef,t.deploymentRef))&&c.add(`modelRef-changed`),d&&!u&&c.add(`became-compound`),!d&&u&&c.add(`became-leaf`),changed(s.parent,t.parent)&&c.add(`parent-changed`);let p=s.width+5>=t.width&&s.height+5>=t.height;changed(s.shape,t.shape)&&(p?s.shape=t.shape:c.add(`shape-changed`)),autoApplyIconStyles(s,t,p)||c.add(`label-changed`),autoApplyIcon(s,t,p&&d===u)||c.add(`label-changed`),(u?autoApplyLabelsToCompound:autoApplyLabelsToLeaf)(s,t,p)||c.add(`label-changed`),changed(s.notes,t.notes)&&(N(t.notes)?delete s.notes:s.notes=patchMarkdownOrString(s.notes,t.notes)),changed(e.notation,t.notation)&&(s.notation=t.notation??null),u&&d&&symmetricDifference(new Set(e.children),new Set(t.children)).size>0&&c.add(`children-changed`);let m=[...c];j(m,1)?(r.add(`nodes-drift`),s.drifts=m):delete s.drifts})):(r.add(`nodes-removed`),{...e,drifts:[`removed`]})});return s.size>0&&r.add(`nodes-added`),c}function applyEdgesManualLayout(e,t,r){let s=new Map(t.map(e=>[e.id,e])),c=e.map(e=>{let t=s.get(e.id)??k(s.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&s.delete(t.id),Ct(e,s=>{if(!t){s.drifts=[`removed`],r.add(`edges-removed`);return}let c=new Set,u=e.id===t.id;switch(!0){case u&&e.source==t.source&&e.target==t.target:changed(s.dir??`forward`,t.dir??`forward`)&&c.add(`direction-changed`);break;case u&&e.source==t.target&&e.target==t.source:e.source!==e.target&&c.add(`direction-changed`);break;case u:e.source!=t.source&&c.add(`source-changed`),e.target!=t.target&&c.add(`target-changed`);break;default:invariant(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),invariant(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),invariant(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),changed(s.dir??`forward`,t.dir??`forward`)&&c.add(`direction-changed`);break}s.color=t.color,s.line=t.line,s.navigateTo=t.navigateTo??null,s.tags=t.tags?[...t.tags]:null,changed(e.notes,t.notes)&&(N(e.notes)!==N(t.notes)&&c.add(`notes-changed`),s.notes=t.notes??e.notes),t.astPath?s.astPath=t.astPath:delete s.astPath;let d=he(e,[`label`,`description`,`technology`,`labelBBox`]),p=he(t,[`label`,`description`,`technology`,`labelBBox`]);if(changed(d,p))switch(!0){case t.labelBBox&&!e.labelBBox:c.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:c.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(s.labelBBox.width=Math.round(t.labelBBox.width),s.labelBBox.height=Math.round(t.labelBBox.height)),changed(e.label,t.label)&&(N(t.label)!==N(e.label)&&c.add(`label-changed`),s.label=t.label??e.label),changed(e.description,t.description)&&(N(t.description)!==N(e.description)&&c.add(`label-changed`),t.description&&(s.description=patchMarkdownOrString(e.description,t.description))),changed(e.technology,t.technology)&&(N(t.technology)!==N(e.technology)&&c.add(`label-changed`),s.technology=t.technology??e.technology??null);break;default:invariant(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),invariant(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let m=[...c];j(m,1)?(r.add(`edges-drift`),s.drifts=m):delete s.drifts})});return s.size>0&&r.add(`edges-added`),c}function calcDriftsFromSnapshot(e,t){let{drifts:r,...s}=applyManualLayout(e,t);if(!r||r.length===0)return Ct(e,e=>{delete e.drifts,e[Ki]=`auto`});let c=new Set;r.includes(`type-changed`)&&c.add(`type-changed`);let u=new Map(s.nodes.map(e=>[e.id,e])),d=new Map(s.edges.map(e=>[e.id,e])),p=e.nodes.map(e=>{let t=u.get(e.id);return t&&u.delete(t.id),Ct(e,e=>{if(!t){c.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(c.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});u.size>0&&c.add(`nodes-removed`);let m=e.edges.map(e=>{let t=d.get(e.id)??k(d.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&d.delete(t.id),Ct(e,e=>{if(!t){c.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(c.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});d.size>0&&c.add(`edges-removed`);let h=[...c];return Ct(e,e=>{j(h,1)?e.drifts=h:delete e.drifts,e.nodes=wt(p),e.edges=wt(m),e[Ki]=`auto`})}function serializeValue(e,t,r,s){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let s=t.get(e);return`[Circular ${s===``?`*`:`*${s}`}]`}t.set(e,s);let c=Array.isArray(e)?[]:{};for(let[u,d]of Object.entries(e))c[u]=serializeValue(d,t,r,s===``?u:`${s}.${u}`);return t.delete(e),c}function safeStringify(e,{indentation:t,trace:r}={}){let s=serializeValue(e,new WeakMap,r,``);return JSON.stringify(s,void 0,t)}const parseStack=e=>e.split(`
10
10
  `).map(e=>e.trim().replace(`file://`,``));function indent$1(e,t=2){e=Array.isArray(e)?e:e.split(`
11
11
  `);let r=` `.repeat(t);return e.map(e=>`${r}${e}`).join(`
12
- `)}t(indent$1,`indent`);function loggable(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=ht(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
13
- `+indent$1(e.slice(1))}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return mt(e,t)}function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=ht(t);return e.stack&&=parseStack(e.stack).join(`
14
- `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?mt(t,e.rawMessage+`
12
+ `)}r(indent$1,`indent`);function loggable(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=St(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
13
+ `+indent$1(e.slice(1))}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return xt(e,t)}function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=St(t);return e.stack&&=parseStack(e.stack).join(`
14
+ `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?xt(t,e.rawMessage+`
15
15
  `):t}function appendErrorToMessage(e,t=!1){let r=getErrorFromLogRecord(e.record);if(r){let s=r.message;return r.stack&&(s=s+`
16
16
  `+indent$1(r.stack.split(`
17
- `).slice(1))),t&&(s=`${ca.red}${s}${sa}`),{...e,message:e.message+`
18
- `+indent$1(s)}}return e}const oa={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>oa[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:s})=>`${e} ${t} ${r} ${s}`);return yt({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const sa=`\x1B[0m`,ca={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:s})=>`${e} ${t} ${r} ${s}`);return xt({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:e=>{let{message:t,properties:r}=e;return r&&Object.keys(r).length>0?[...t,r]:t}}function getConsoleSink(e){return bt({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const la=vt(`likec4`);function createLogger(e){return la.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...s}=e??{},c={console:getConsoleSink(),...t};St({reset:!0,...s,sinks:c,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`);function findParallelRects(e){return N(e,se(e=>e.parallelPrefix??void 0),g((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}})),Fe())}function buildCompounds(e,t){if(e.length===0||e.length===t.length)return[];let getNode=e=>nonNullable(t.find(t=>t.id===e));function parentsLookup(e){let t=e.parent?getNode(e.parent):null;return t?[t,...parentsLookup(t)]:[]}let r=new et.default,s=[];return e.forEach(e=>{let t=parentsLookup(e);if(t.length===0){r.clear();return}let c=et.default.from(t),u,d;for(;u=r.peek()?.node,d=c.peek(),!(!d||!u);){if(isAncestor(d.id,u.id)||d.id===u.id){c.pop();continue}if(!isAncestor(u.id,d.id)){r.pop();continue}break}for(;d=c.pop();){let t={node:d,from:e,to:e,nested:[]},c=r.peek();c?c.nested.push(t):s.push(t),r.push(t)}r.forEach(t=>t.to=e)}),s}var SequenceViewLayouter=class{#e=new Dt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:r}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of r){let t=this.addCompound(e),r=t[0];this.constraint(r.y1,`==`,0,wt.strong),this.put(this.#i).after(r.bottom),this.put(this.#a).after(r.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of findParallelRects(t))this.addParallelRect(e);let s=this.#t[0];this.constraint(s.offset.left,`==`,0,wt.strong);let c=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,wt.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,wt.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(c.offset.right),this.put(this.#i).after(Te(this.#o)?.bottom??this.#a),r.length>0)for(let e of this.#n){let t=e.from.column,r=e.to.column,s=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<r;e++){let t=this.actorBox(e);s=Math.max(s,t.maxRow)}let c=nonNullable(this.#o[s],`row ${s} not found`);this.put(e.bottom).after(c.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:r,x2:s,y2:c})=>({parallelPrefix:e,x:t.value(),y:r.value(),width:s.value()-t.value(),height:c.value()-r.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:r,y1:s,x2:c,bottom:u})=>({node:e,depth:t,x:r.value(),y:s.value(),width:c.value()-r.value(),height:u.value()-s.value()}))}getPortCenter(e,t){let{column:r,row:s}=t===`source`?e.from:e.to,c=this.actorBox(r).centerX,{y:u}=nonNullable(this.#o[s]);return{cx:c.value(),cy:u.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),invariant(e>=0,`actor ${t} not found`)}return nonNullable(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return D(e,(e,r)=>{let s=this.newVar(t);t+=e.width+60;let c=this.newVar(0),u={column:r,actor:e,x:s,y:c,centerX:s.plus(Math.round(e.width/2)),centerY:c.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:s.plus(e.width),bottom:c.plus(e.height),minRow:1/0,maxRow:-1/0},d=this.newVar(0),p=this.newVar(0),m=this.newVar(0),h=this.newVar(0);return this.put(d,wt.strong).before(c),this.put(p,wt.strong).before(s),this.put(m,wt.strong).after(u.right),this.put(h,wt.strong).after(u.bottom),{...u,offset:{top:d,left:p,right:m,bottom:h}}})}addStep(e){let t=this.actorBox(e.source),r=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),r.minRow=Math.min(r.minRow,e.to.row),r.maxRow=Math.max(r.maxRow,e.to.row);let[s,c]=t.column<=r.column?[t,r]:[r,t],u=(e.label?.width??100)+50;s===c?this.constraint(s.centerX.plus(u),`<=`,s.offset.right):this.constraint(s.centerX.plus(u),`<=`,c.centerX);let d=e.label?.height?e.label.height+50+32/2:80;return d=Math.max(d,80)+e.offset,this.ensureRow(e.from.row,d),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:r}){let s=this.actorBox(t.column).centerX.minus(30),c=this.actorBox(r.column).centerX.plus(30),u=this.#o[t.row],d=this.#o[r.row];invariant(u&&d,`parallel box invalid minRow=${t.row} maxRow=${r.row}`);let p=this.newVar(0);this.put(p).before(u.y,40);let m=d.bottom,h=t.row>0&&this.#o[t.row-1];h&&this.put(p).after(h.bottom,16);let g=r.row<this.#o.length-1&&this.#o[r.row+1];g&&this.put(m).before(g.y,16),this.#s.push({parallelPrefix:e,x1:s,y1:p,x2:c,y2:m})}addCompound(e){let t=[],r=e.nested.flatMap(e=>{let r=this.addCompound(e);return t.push(r[0]),r}),s=Math.max(...r.map(e=>e.depth+1),0),c=this.actorBox(e.from),u=this.actorBox(e.to),d=c.offset.left.minus(32);c.offset.left=d;let p=u.offset.right.plus(32);u.offset.right=p;let m=this.newVar(0),h=A(t),g,_;switch(!0){case!!h:g=h.y1.minus(40),_=h.y2.plus(32),this.put(m).after(h.bottom,32);break;case u===c:g=this.newVar(0),_=this.newVar(0),this.put(g).before(c.offset.top,52),this.put(_).after(c.offset.bottom,32),this.put(m).after(_);break;case t.length>0:g=this.newVar(0),_=this.newVar(0);for(let e of t)this.put(g).before(e.y1,32),this.put(_).after(e.y2,32),this.put(m).after(e.bottom,32);break;default:g=this.newVar(0),_=this.newVar(0);for(var v=c.column;v<=u.column;v++){let e=this.actorBox(v).offset;this.put(g).before(e.top,52),this.put(_).after(e.bottom,32)}this.put(m).after(_);break}for(var v=c.column;v<=u.column;v++){let e=this.actorBox(v).offset;e.top=g,e.bottom=_}return[{node:e.node,depth:s,from:c,to:u,x1:d,y1:g,x2:p,y2:_,bottom:m},...r]}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 r=this.newVar(80);this.require(r,`>=`,80),this.#o.push({y:t,height:r,bottom:t.plus(r),lastHeight:80})}let r=nonNullable(this.#o[e]);t>r.lastHeight&&(r.lastHeight=t,this.require(r.height,`>=`,t),this.#e.suggestValue(r.height,t))}newVar(e){let t=new Ct;return this.#e.addEditVariable(t,wt.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,wt.strong)),t}require(e,t,r=void 0){switch(this.constraint(e,t,r,wt.required),t){case`<=`:case`>=`:this.constraint(e,`==`,r,wt.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,wt.weak);break}}constraint(e,t,r=void 0,s=wt.medium){let c;switch(t){case`==`:c=Et.Eq;break;case`>=`:c=Et.Ge;break;case`<=`:c=Et.Le;break;case`== 0`:c=Et.Eq,r=0;break;case`>= 0`:c=Et.Ge,r=0;break;case`<= 0`:c=Et.Le,r=0;break;default:nonexhaustive(t)}this.#e.addConstraint(new Tt(e,c,r??0,s))}put(e,t=wt.required){let r=t===wt.required?wt.medium:wt.weak;return{before:(s,c)=>{c&&(s=s.minus(c)),this.constraint(e,`<=`,s,t),this.constraint(e,`==`,s,r)},after:(s,c)=>{c&&(s=s.plus(c)),this.constraint(e,`>=`,s,t),this.constraint(e,`==`,s,r)}}}};function calcSequenceLayout(e){let t=new Set,getNode=t=>nonNullable(e.nodes.find(e=>e.id===t)),r=[];for(let s of e.edges.filter(e=>isStepEdgeId(e.id))){let e=getNode(s.source),c=getNode(s.target);if(e.children.length||c.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(c),r.push({edge:s,source:e,target:c})}let s=e.nodes.filter(e=>t.has(e));invariant(P(s,1),`actors array must not be empty`);let c=new L.default(()=>[]),u=[],d=0;for(let{edge:e,source:t,target:p}of r){let r=u.at(-1),m=s.indexOf(t),h=s.indexOf(p),g=t===p,_=m>h,v=getParallelStepsPrefix(e.id),y=!1;r&&r.target==t&&r.parallelPrefix===v&&(y=r.isSelfLoop!==g||r.isBack===_),y||d++;let b={id:e.id,from:{column:m,row:d},to:{column:h,row:g?++d:d},edge:e,isSelfLoop:g,isBack:_,parallelPrefix:v,offset:y?(r?.offset??0)+22:0,source:t,target:p,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};u.push(b),c.get(t).push({step:b,row:d,type:`source`,position:_&&!g?`left`:`right`}),c.get(p).push({step:b,row:d,type:`target`,position:_||g?`right`:`left`})}let p=new SequenceViewLayouter({actors:s,steps:u,compounds:buildCompounds(s,e.nodes)}),m=p.getViewBounds(),h=N(p.getCompoundBoxes(),D(({node:e,...t})=>({...t,id:e.id,origin:e.id})),ae(`id`),g((e,t)=>P(e,2)?D(e,(e,r)=>({...e,id:`${t}-${r+1}`})):e),Fe(),Ae());return{actors:s.map(e=>toSeqActor({actor:e,ports:c.get(e),layout:p})),compounds:h,steps:D(u,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:p.getParallelBoxes(),bounds:m}}function toSeqActor({actor:e,ports:t,layout:r}){let{x:s,y:c,width:u,height:d}=r.getActorBox(e);return{id:e.id,x:s,y:c,width:u,height:d,ports:t.map(e=>{let t=r.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-s,cy:t.cy-c,height:t.height,type:e.type,position:e.position}})}}const J=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let s=e?this.Digraph:this.Graph,c=r.find(e=>typeof e==`string`),u=r.find(e=>typeof e==`object`),d=r.find(e=>typeof e==`function`),p=new s(c,t,u);return p.with(this),typeof d==`function`&&d(p),p}}function n(e,t=At){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const ua=n(!1),da=ua.digraph;ua.graph,n(!0);function O(e,t){return kt(jt(e,t?.convert),t?.print)}Ot()
17
+ `).slice(1))),t&&(s=`${ba.red}${s}${ya}`),{...e,message:e.message+`
18
+ `+indent$1(s)}}return e}const va={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>va[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:s})=>`${e} ${t} ${r} ${s}`);return Et({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const ya=`\x1B[0m`,ba={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:s})=>`${e} ${t} ${r} ${s}`);return Ot({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:e=>{let{message:t,properties:r}=e;return r&&Object.keys(r).length>0?[...t,r]:t}}function getConsoleSink(e){return Dt({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const xa=Tt(`likec4`);function createLogger(e){return xa.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...s}=e??{},c={console:getConsoleSink(),...t};kt({reset:!0,...s,sinks:c,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}r(configureLogger$1,`configureLogger`);const paddingFromNumber=e=>({left:e,right:e,top:e,bottom:e});function normalizeSpacing(e=16){return typeof e==`number`?paddingFromNumber(e):{left:e?.left??e?.x??0,right:e?.right??e?.x??0,top:e?.top??e?.y??0,bottom:e?.bottom??e?.y??0}}function rectFromSteps(e){return invariant(e.length>0),e.reduce((e,t)=>{let r=[t.from.column,t.to.column],s=[t.from.row,t.to.row];return e.min.column=Math.min(e.min.column,...r),e.min.row=Math.min(e.min.row,...s),e.max.column=Math.max(e.max.column,...r),e.max.row=Math.max(e.max.row,...s),e},{min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})}function buildCompounds(e,t){if(e.length===0||e.length===t.length)return[];let getNode=e=>t.find(t=>t.id===e);function parentsLookup(e){let t=e.parent&&getNode(e.parent);return t?[t,...parentsLookup(t)]:[]}let r=new st.default,s=[];return e.forEach(e=>{let t=parentsLookup(e);if(t.length===0){r.clear();return}let c,u=t[0];for(;c=r.peek()?.node;){if(!u||c.id===u.id){t.length=0;break}if(!isAncestor(c.id,u.id)){r.pop();continue}break}for(;c=t.pop();){let t=r.peek();if(t&&(isAncestor(c.id,t.node.id)||c.id===t.node.id))continue;let u={node:c,from:e,to:e,nested:[]};t?t.nested.push(u):s.push(u),r.push(u)}r.forEach(t=>t.to=e)}),s}const Sa={required:ei.Strength.required,strong:ei.Strength.strong,medium:ei.Strength.medium,soft:ei.Strength.create(0,.8,1),weak:ei.Strength.weak};var SequenceViewLayouter=class{#e;#t=new ei.Solver;#n;#r=[];#i;#a;#o;#s=[];#c=new Map;constructor({actors:e,steps:t,compounds:r,flow:s,collapsedFlows:c}){this.#t.maxIterations=2e3,this.#e=s;let u=Math.max(...e.map(e=>e.height))+30;this.#o=this.newVar(u),this.constraint(this.#o,`==`,u,Sa.soft),this.constraint(this.#o,`>=`,u,Sa.weak),this.#i=this.newVar(0),this.#a=this.newVar(0),this.#n=this.addActors(e);for(let e of r){let t=this.addCompound(e),r=t[0];this.constraint(r.y1,`==`,0,Sa.strong),this.put(this.#o,Sa.strong).after(r.y2),this.#r.push(...t)}let[d,...p]=this.#n;this.constraint(d.offset.left,`==`,0,Sa.strong);let m=p.reduce((e,t)=>(this.put(t.x).after(e.right,80),this.put(e.offset.right,Sa.strong).before(t.offset.left,50),this.constraint(t.centerY,`==`,e.centerY,Sa.strong),t),d);for(let e of t)this.addStep(e);this.createSubflowAreas(t,new Set(c)),this.constraint(this.#i,`==`,m.offset.right);let h=ke(this.#s)?.inner.bottom??this.#o;if(this.put(this.#a,Sa.strong).after(h,16),r.length>0)for(let e of this.#r){let t=e.from.column,r=e.to.column,s=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<r;e++){let t=this.actorBox(e);s=Math.max(s,t.maxRow)}let c=nonNullable(this.#s[s],`row ${s} not found`);this.put(e.bottom,Sa.strong).after(c.inner.bottom,10)}this.#t.updateVariables()}getSubflowAreas(){return[...this.#c.entries()].map(([e,{x1:t,y1:r,x2:s,y2:c}])=>({id:e,x:t.value(),y:r.value(),width:s.value()-t.value(),height:c.value()-r.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.#r.map(({node:e,depth:t,x1:r,y1:s,x2:c,bottom:u})=>({node:e,depth:t,x:r.value(),y:s.value(),width:c.value()-r.value(),height:u.value()-s.value()}))}getPortCenter(e,t){let{column:r,row:s}=t===`source`?e.from:e.to,c=this.actorBox(r).centerX,{rowTop:u}=nonNullable(this.#s[s]);return{cx:c.value(),cy:u.value()+40+e.offset,height:t===`source`?40:24}}isStepCollapsed(e){if(e.from.row===e.to.row)return this.#s[e.from.row]?.collapsed??!1;let t=Math.min(e.from.row,e.to.row),r=Math.min(e.from.row,e.to.row),s=!0;for(let e=t;e<=r&&(s&&=this.#s[e]?.collapsed??!1,s);e++);return s}getViewBounds(){return{x:0,y:0,width:this.#i.value(),height:this.#a.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#n.findIndex(e=>e.actor.id===t),invariant(e>=0,`actor ${t} not found`)}return nonNullable(this.#n[e],`actor at index ${e} not found`)}addActors(e){let t=0;return w(e,(e,r)=>{let s=this.newVar(t);t+=e.width+80;let c=this.newVar(0),u={column:r,actor:e,x:s,y:c,centerX:s.plus(Math.round(e.width/2)),centerY:c.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:s.plus(e.width),bottom:c.plus(e.height),minRow:1/0,maxRow:-1/0},d=this.newVar(0),p=this.newVar(0),m=this.newVar(0),h=this.newVar(0);return this.put(c,Sa.strong).after(d),this.put(s,Sa.strong).after(p),this.put(u.right,Sa.strong).before(m),this.put(u.bottom,Sa.strong).before(h),{...u,offset:{top:d,left:p,right:m,bottom:h}}})}addStep(e){let t=this.actorBox(e.source),r=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),r.minRow=Math.min(r.minRow,e.to.row),r.maxRow=Math.max(r.maxRow,e.to.row);let[s,c]=t.column<=r.column?[t,r]:[r,t],u=(e.label?.width??100)+50;Math.abs(r.column-t.column)<=1&&(s===c?this.constraint(s.centerX.plus(u),`<=`,s.offset.right):this.constraint(s.centerX.plus(u),`<=`,c.centerX));let d=e.label?.height?e.label.height+50+24:100;return d=Math.max(d,100)+e.offset,this.ensureRow(e.from.row,d),e.isSelfLoop&&this.ensureRow(e.to.row,0),this}addCompound(e){let t=[],r=e.nested.flatMap(e=>{let r=this.addCompound(e);return t.push(r[0]),r}),s=Math.max(...r.map(e=>e.depth+1),0),c=this.actorBox(e.from),u=this.actorBox(e.to),d=c.offset.left.minus(32);c.offset.left=d;let p=u.offset.right.plus(32);u.offset.right=p;let m=this.newVar(0),h=T(t),g,_;switch(!0){case!!h:g=h.y1.minus(40),_=h.y2.plus(32),this.put(h.bottom).before(m,32);break;case u===c:g=this.newVar(0),_=this.newVar(0),this.put(g).before(c.offset.top,52),this.put(c.offset.bottom).before(_,32),this.put(_).before(m);break;case t.length>0:g=this.newVar(0),_=this.newVar(0);for(let e of t)this.put(g).before(e.y1,32),this.put(e.y2).before(_,32),this.put(e.bottom).before(m,32);break;default:g=this.newVar(0),_=this.newVar(0);for(var v=c.column;v<=u.column;v++){let e=this.actorBox(v).offset;this.put(g).before(e.top,52),this.put(e.bottom).before(_,32)}this.put(_).before(m);break}for(var v=c.column;v<=u.column;v++){let e=this.actorBox(v).offset;e.top=g,e.bottom=_}return[{node:e.node,depth:s,from:c,to:u,x1:d,y1:g,x2:p,y2:_,bottom:m},...r]}ensureRow(e,t){for(;e>=this.#s.length;){let r=ke(this.#s)?.outer.bottom||this.#o,s=this.newVar(r.value());this.put(s).after(r);let c=t;e!==this.#s.length&&(c=100);let u=new ei.Variable;u.setValue(c),this.#t.addEditVariable(u,Sa.strong),this.#t.suggestValue(u,c);let d=this.newVar(s.value()+c);this.require(d).after(s),this.constraint(d.minus(s),`==`,u,Sa.strong);let p=this.newVar(d.value());this.put(p).after(d),this.#s.push({inner:{top:s,bottom:d},rowTop:s,outer:{top:r,bottom:p},height:u})}let r=nonNullable(this.#s[e]);return t>r.height.value()&&(r.height.setValue(t),this.#t.suggestValue(r.height,t)),r}collapseRect({min:e,max:t}){for(let r=e.row;r<=t.row;r++){let e=nonNullable(this.#s[r],`Row ${r} not found`);e.collapsed=!0,e.height.setValue(0),this.#t.suggestValue(e.height,0)}}getRectBounds({min:e,max:t}){let r=this.#s[e.row],s=this.#s[t.row];return invariant(r&&s,`Subflow box invalid minRow=${e.row} maxRow=${t.row}`),{x1:this.actorBox(e.column).centerX,x2:this.actorBox(t.column).centerX,get top(){return r.inner.top},set top(e){r.inner.top=e},get bottom(){return s.inner.bottom},set bottom(e){s.inner.bottom=e},minY:r.outer.top,maxY:s.outer.bottom}}wrapAroundRect(e,t){let r=normalizeSpacing(t??16),s=this.getRectBounds(e),c=this.newVar(0);this.put(c).before(s.x1,r.left);let u=this.newVar(0);this.put(u).after(s.x2,r.right);let d=this.newVar(s.minY.value());this.require(d).after(s.minY),this.put(d).before(s.top,r.top);let p=this.newVar(s.maxY.value());return this.put(p).after(s.bottom,r.bottom),this.require(p).before(s.maxY),s.top=d,s.bottom=p,{x1:c,y1:d,x2:u,y2:p}}createSubflowAreas(e,t){let selectSteps=t=>M(e,e=>e.id.startsWith(t)),r={top:30,right:40,bottom:10,left:90},fitSubflows=({area:e,visited:t,stretch:s=!1,padding:c})=>{let u=k(t,M(ta.isSubFlow),A(e=>this.#c.get(e.id)??[]));if(!j(u,1))return;let d=Qi(c,r),p=Ue(u),m=ke(u);p.min.row==e.min.row&&this.require(e.y1).before(p.y1,d.top),m.max.row==e.max.row&&this.require(m.y2).before(e.y2,d.bottom);for(let t of u)this.require(t.x1).after(e.x1,d.left),this.require(t.x2).before(e.x2,d.right),s&&(t.x1=d.left>0?e.x1.plus(d.left):e.x1,t.x2=d.right>0?e.x2.minus(d.right):e.x2)},createSubflowArea=e=>{let s=rectFromSteps(selectSteps(e.id)),c;switch(!0){case ta.isAltOrTry(e):c=0;break;case t.has(e.id)&&ta.isAltOrTryBranch(e):c={...r,top:36,bottom:0};break;case t.has(e.id):c={...r,top:24,bottom:0};break;default:c=r;break}let u={...this.wrapAroundRect(s,c),...s};return this.#c.set(e.id,u),u};this.#e.walk({subflow:({subflow:e,previous:r,parent:s})=>({next:t.has(e.id)?[]:e.flow,onLeave:({visited:c})=>{let u=createSubflowArea(e),d=ta.isSubFlow(r)&&this.#c.get(r.id);switch(!ta.isAltOrTryBranch(e)&&d&&this.put(d.y2).before(u.y1,32),!s&&u.min.column>0&&this.require(this.actorBox(u.min.column-1).centerX).before(u.x1,100),!0){case t.has(e.id):this.collapseRect(u);return;case ta.isAltOrTry(e):return fitSubflows({area:u,visited:c,padding:{top:30,left:0,right:0},stretch:!0});case ta.isAltOrTryBranch(e):return fitSubflows({area:u,visited:c,padding:{top:50,left:32,bottom:32,right:32}});default:return fitSubflows({area:u,visited:c,padding:{top:40,bottom:12,left:32,right:16}})}}})})}newVar(e){let t=new ei.Variable;return this.#t.addEditVariable(t,Sa.weak),typeof e==`number`&&(t.setValue(e),this.#t.suggestValue(t,e)),t}require(...e){if(e.length==1){let[t]=e;return{before:(e,r=0)=>{let s=r?e.minus(r):e;return this.constraint(t,`<=`,s,Sa.required)},after:(e,r=0)=>{let s=r?e.plus(r):e;return this.constraint(t,`>=`,s,Sa.required)}}}let[t,r,s]=e,c=this.constraint(t,r,s,Sa.required);switch(r){case`<=`:case`>=`:this.constraint(t,`==`,s,Sa.weak);break;case`<= 0`:case`>= 0`:this.constraint(t,`== 0`,void 0,Sa.weak);break}return c}constraint(e,t,r=void 0,s=Sa.medium){let c;switch(t){case`==`:c=ei.Operator.Eq;break;case`>=`:c=ei.Operator.Ge;break;case`<=`:c=ei.Operator.Le;break;case`== 0`:c=ei.Operator.Eq,r=0;break;case`>= 0`:c=ei.Operator.Ge,r=0;break;case`<= 0`:c=ei.Operator.Le,r=0;break;default:nonexhaustive(t)}let u=new ei.Constraint(e,c,r??0,s);return this.#t.addConstraint(u),u}put(e,t=Sa.required){let r=t===Sa.required?Sa.soft:Sa.weak;return{before:(s,c)=>{c&&(s=s.minus(c)),this.constraint(e,`<=`,s,t),this.constraint(e,`==`,s,r)},after:(s,c)=>{c&&(s=s.plus(c)),this.constraint(e,`>=`,s,t),this.constraint(e,`==`,s,r)}}}};function calcSequenceLayout(e){let t=dynamicViewFlow(e),r=new Set,getNode=t=>nonNullable(e.nodes.find(e=>e.id===t)),s=[];for(let t of e.edges){let e=getNode(t.source),c=getNode(t.target);if(e.children.length||c.children.length){console.error(`Sequence view does not support nested actors`);continue}r.add(e),r.add(c),s.push({edge:t,source:e,target:c})}let c=e.nodes.filter(e=>r.has(e));invariant(j(c,1),`actors array must not be empty`);let u=new P.default(()=>[]),d=[],p=0,m;for(let{edge:e,source:t,target:r}of s){let s=c.indexOf(t),h=c.indexOf(r),g=t===r,_=s>h,v=parentFlow(e.id),y=!1;m&&m.target==t&&m.parent===v&&(y=m.isSelfLoop!==g||m.isBack===_),!y&&m&&p++;let b={id:e.id,from:{column:s,row:p},to:{column:h,row:g?++p:p},edge:e,isSelfLoop:g,isBack:_,parent:v,offset:y?(m?.offset??0)+22:0,source:t,target:r,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};d.push(b),u.get(t).push({step:b,row:p,type:`source`,position:_&&!g?`left`:`right`}),u.get(r).push({step:b,row:p,type:`target`,position:_||g?`right`:`left`}),m=b}let g=new SequenceViewLayouter({actors:c,steps:d,compounds:buildCompounds(c,e.nodes),flow:t,collapsedFlows:[]}),_=g.getViewBounds(),v=k(g.getCompoundBoxes(),w(({node:e,...t})=>({...t,id:e.id,origin:e.id})),de(`id`),h((e,t)=>j(e,2)?w(e,(e,r)=>({...e,id:`${t}-${r+1}`})):e),Be(),me());return{actors:c.map(e=>toSeqActor({actor:e,ports:u.get(e),layout:g})),compounds:v,steps:w(d,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:[],subflows:g.getSubflowAreas(),bounds:_}}function toSeqActor({actor:e,ports:t,layout:r}){let{x:s,y:c,width:u,height:d}=r.getActorBox(e);return{id:e.id,x:s,y:c,width:u,height:d,ports:t.map(e=>{let t=r.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-s,cy:t.cy-c,height:t.height,type:e.type,position:e.position}})}}const J=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let s=e?this.Digraph:this.Graph,c=r.find(e=>typeof e==`string`),u=r.find(e=>typeof e==`object`),d=r.find(e=>typeof e==`function`),p=new s(c,t,u);return p.with(this),typeof d==`function`&&d(p),p}}function n(e,t=Mt){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const Ca=n(!1),wa=Ca.digraph;Ca.graph,n(!0);function O(e,t){return jt(Nt(e,t?.convert),t?.print)}At()
19
19
  /*!
20
20
  * word-wrap <https://github.com/jonschlinkert/word-wrap>
21
21
  *
22
22
  * Copyright (c) 2014-2023, Jon Schlinkert.
23
23
  * Released under the MIT License.
24
24
  */
25
- ;var fa=e(s(((e,t)=>{function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
25
+ ;var Ta=e(s(((e,t)=>{function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
26
26
  `).map(e=>trimEnd(e)).join(`
27
27
  `)}t.exports=function(e,t){if(t||={},e==null)return e;var r=t.width||50,s=typeof t.indent==`string`?t.indent:` `,c=t.newline||`
28
28
  `+s,u=typeof t.escape==`function`?t.escape:identity,d=`.{1,`+r+`}`;t.cut!==!0&&(d+=`([\\s​]+|$)|[^\\s​]+?([\\s​]+|$)`);var p=new RegExp(d,`g`),m=s+(e.match(p)||[]).map(function(e){return e.slice(-1)===`
29
- `&&(e=e.slice(0,e.length-1)),u(e)}).join(c);return t.trim===!0&&(m=trimTabAndSpaces(m)),m};function identity(e){return e}}))(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(invariant(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(invariant(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Nt(Pt(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Nt(Mt(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:s=x()}){let c=(0,fa.default)(e,{width:t,indent:``,escape:s}).split(`
30
- `);return ie(r)&&r>0&&c.length>r&&(c=c.slice(0,r)),c}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:s,bold:c,color:u}){let d=wrap(e,{maxchars:t,maxLines:s,sanitize}).join(`<BR/>`);c&&(d=`<B>${d}</B>`);let p=u?` COLOR="${u}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${p}>${d}</FONT>`}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:nonexhaustive(e)}}function nodeLabel(e,t){let{sizes:{size:r},values:s}=t.nodeSizes(e.style),c=t.colors(e.color).elements,u=[`sm`,`xs`].includes(r),d=T(e.icon),p=e.style.iconPosition??`left`,m=d&&(p===`left`||p===`right`),h=[wrapWithFont({text:e.title,fontsize:s.textSize,maxchars:maxchars(r),maxLines:u?1:3})];if(r!==`xs`){T(e.technology?.trim())&&h.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(s.textSize*.65),maxchars:m?35:45,maxLines:1,color:c.loContrast}));let t=Zi.from(e.description).text;t&&h.push(wrapWithFont({text:t,fontsize:Math.ceil(s.textSize*.75),maxchars:m?35:45,maxLines:u?3:5,color:c.loContrast}))}if(h.length===1&&d===!1)return`<${h[0]}>`;let g=m?(t,r,c)=>{let u=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=c.length>1?` ROWSPAN="${c.length}"`:``,r=Math.ceil(s.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),p===`right`?(u=`<TD${t} WIDTH="16"> </TD>${u}`,u=`${u}<TD${t} WIDTH="${r}"> </TD>`):(u=`<TD${t} WIDTH="${r}"> </TD>${u}`,u=`${u}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${u}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,_=h.map(g).join(``);if(d&&(p===`top`||p===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(s.iconSize+8)}"> </TD></TR>`;_=p===`top`?`${e}${_}`:`${_}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${_}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const pa=`BGCOLOR="${Ji.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=[];return T(e?.trim())&&r.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),T(t?.trim())&&r.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),r.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${pa}>${r.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${pa}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return T(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${pa} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}var ma=tt(),ha=e(nt(),1);const ga=`Arial`,_a=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new L.default(e=>nonNullable(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=_a;graphology=new Ft({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).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`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let s=-1;e!==null&&r!==null&&(s=hierarchyDistance(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:s,weight:1}),s>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:s}),s>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:s})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,s,c,u)=>{let d=Math.max(c.maxConnectedHierarchyDistance,u.maxConnectedHierarchyDistance);if(d>t)this.graphology.mergeEdgeAttributes(e,{weight:d-t+1});else{let c=this.graphology.directedDegree(r),u=this.graphology.directedDegree(s);c===1&&u===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}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){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))k(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),s=this.elementToNode(r,e.node(t));this.nodes.set(r.id,s)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),s=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,s);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,s);else{let t=this.getGraphNode(e.id);t&&s.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(J.rank))&&this.G.set(J.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,r=da({[J.likec4_viewId]:this.view.id,[J.bgcolor]:`transparent`,[J.layout]:`dot`,[J.compound]:!0,[J.rankdir]:t,[J.TBbalance]:`min`,[J.splines]:`spline`,[J.outputorder]:`nodesfirst`,[J.nodesep]:pxToInch(e.nodeSep??110),[J.ranksep]:pxToInch(e.rankSep??120),[J.pad]:pxToInch(15),[J.fontname]:ga});return r.attributes.graph.apply({[J.fontsize]:pxToPoints(this.styles.fontSize()),[J.labeljust]:t===`RL`?`r`:`l`,[J.labelloc]:t===`BT`?`b`:`t`,[J.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[J.fontname]:ga,[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]:ga,[J.fontsize]:pxToPoints(14),[J.penwidth]:pxToPoints(2),[J.color]:t.line,[J.fontcolor]:t.label,[J.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?!1:(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=nameFromFqn(e.id).toLowerCase(),s=this.reserveNodeId(r,t),c=1;for(;s===!1;)s=this.reserveNodeId(r+`_`+ c++,t);return s}elementToSubgraph(e,t){invariant(isCompound(e),`node should be compound`),invariant(w(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,s=compoundLabelColor(r.loContrast);return t.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.likec4_depth]:e.depth,[J.fillcolor]:compoundColor(r.fill,e.depth),[J.color]:compoundColor(r.stroke,e.depth),[J.style]:`filled`,[J.margin]:pxToPoints(e.children.length>1?40:32)}),j(e.title.trim())||t.set(J.label,compoundLabel(e,s)),t}elementToNode(e,t){invariant(!isCompound(e),`node should not be compound`);let r=T(e.icon),{values:{padding:s,sizes:{width:c,height:u}}}=this.styles.nodeSizes(e.style),d=r?8:s;if(t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.label]:nodeLabel(e,this.styles),[J.margin]:`${pxToInch(d)},${pxToInch(s)}`}),t.attributes.set(J.width,pxToInch(c)),t.attributes.set(J.height,pxToInch(u)),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[J.fillcolor]:r.fill,[J.fontcolor]:r.hiContrast,[J.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[J.margin]:`${pxToInch(d)},${pxToInch(0)}`,[J.penwidth]:pxToPoints(2),[J.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s+6)}`});break;case`mobile`:t.attributes.apply({[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s)}`});break;case`queue`:t.attributes.apply({[J.width]:pxToInch(c),[J.height]:pxToInch(u-8),[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s)}`});break;case`component`:t.attributes.apply({[J.width]:pxToInch(c+10),[J.margin]:`${pxToInch(d+20)},${pxToInch(s)}`});break;default:break}return t}leafElements(e){return e===null?F([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),s=this.getGraphNode(e),c;return s?[r,s,void 0]:(invariant(isCompound(r),`endpoint node should be compound`),c=this.getSubgraph(e)?.id,invariant(c,`subgraph ${e} not found`),r=nonNullable(t(this.leafElements(e)),`leaf element in ${e} not found`),s=nonNullable(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,s,c])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return N(this.descendants(e),I(e=>Ne(e.inEdges,e.outEdges)),le(),Ve(Ne(t.inEdges,t.outEdges)),D(e=>this.view.edges.find(t=>t.id===e)),F(T))}assignGroups(){let e=N(this.view.nodes,F(isCompound),D(e=>e.id),me(compareFqnHierarchically),ge(),D(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),F(({edges:e})=>e.length>1&&e.length<8),fe(4)),t=new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let s of e)try{let e=nonNullable(this.getGraphNode(s.source),`Graphviz Node not found for ${s.source}`),c=nonNullable(this.getGraphNode(s.target),`Graphviz Node not found for ${s.target}`);t.add(s.source),t.add(s.target),e.attributes.set(J.group,r.id),c.attributes.set(J.group,r.id)}catch(e){_a.error(`Failed to assign group to edge ${s.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(J.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let s=e.findIndex(e=>e.id===r);s!==-1&&t.push(...e.splice(s,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let s=e.findIndex(e=>e.id===r);s!==-1&&t.push(...e.splice(s,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(p);if(r.length===0||t.rank===`same`&&r.length===1)continue;let s=e.createSubgraph({[J.rank]:t.rank});for(let e of r)s.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[s,c]=r?[e.target,e.source]:[e.source,e.target],[,u,d]=this.edgeEndpoint(s,e=>Te(e)),[,m,h]=this.edgeEndpoint(c,Ie),g=t.edge([u,m],{[J.likec4_id]:e.id});e.line&&e.line!==`dashed`&&g.attributes.set(J.style,e.line),h&&g.attributes.set(J.lhead,h),d&&g.attributes.set(J.ltail,d);let _=p(h)||p(d),v=edgelabel(e);if(v&&g.attributes.set(_?J.xlabel:J.label,v),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let y=this.aiHints.edgeWeight[e.id];y!==void 0&&y!==1&&g.attributes.set(J.weight,y);let b=this.aiHints.edgeMinlen[e.id];return b!==void 0&&b!==1&&g.attributes.set(J.minlen,b),this.aiHints.excludeFromRanking?.includes(e.id)&&g.attributes.set(J.constraint,!1),r&&g.attributes.set(J.dir,`back`),g}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...s}of this.aiHints.invisibleEdges){let c=this.getGraphNode(t),u=this.getGraphNode(r);if(!c||!u)continue;let d=`invisible_${t}->${r}`;if(this.edges.has(d)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${d}, skipping creation`;continue}this.graphology.addEdgeWithKey(d,t,r,{hierarchyDistance:0,origin:`invisible`,weight:s.weight??1});let p=e.edge([c,u],{[J.style]:`invis`});this.edges.set(d,p),s.minlen!==void 0&&s.minlen!==1&&p.attributes.set(J.minlen,s.minlen),s.weight!==void 0&&s.weight!==1&&p.attributes.set(J.weight,s.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return w(e.rankSep)||!(Re(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(J.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(J.TBbalance),e.apply({[J.nodesep]:pxToInch(t.nodeSep??130),[J.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return N(this.view.nodes,D(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),se(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Fe(),D(e=>e),he(t=>{t.length<2||e.subgraph({[J.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(nonNullable(r).id)})}),je(()=>{e.set(J.newrank,!0),e.set(J.clusterrank,`global`),e.delete(J.pack),e.delete(J.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(J.margin,pxToPoints(50)),r}addEdge(e,t){let[r,s]=[e.source,e.target],[c,u,d]=this.edgeEndpoint(r,e=>Te(e)),[m,h,g]=this.edgeEndpoint(s,Ie),_=p(g)||p(d),v=t.edge([u,h],{[J.likec4_id]:e.id,[J.style]:e.line??`dashed`});g&&v.attributes.set(J.lhead,g),d&&v.attributes.set(J.ltail,d);let y=this.graphology.getEdgeAttribute(e.id,`weight`);y>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&v.attributes.set(J.weight,y);let b=edgelabel(e);if(b&&v.attributes.set(_?J.xlabel:J.label,b),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;v.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let[x,S]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return x===`none`&&S===`none`?(v.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`}),v):e.dir===`both`?(v.attributes.apply({[J.arrowhead]:toArrowType(x),[J.arrowtail]:toArrowType(e.tail??x),[J.dir]:`both`}),!_&&c.modelRef!==m.modelRef&&v.attributes.set(J.constraint,!1),v):(x&&v.attributes.set(J.arrowhead,toArrowType(x)),S!==`none`&&v.attributes.set(J.arrowtail,toArrowType(S)),v)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(J.TBbalance),e.set(J.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[s,c]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[u,d,p]=this.edgeEndpoint(s,e=>Te(e)),[m,h,g]=this.edgeEndpoint(c,Ie),_=t.edge([d,h],{[J.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&_.attributes.set(J.style,e.line),g&&_.attributes.set(J.lhead,g),p&&_.attributes.set(J.ltail,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let v=[e.label?.trim(),e.technology?.trim()].filter(T).join(`
31
- `),y=stepEdgeLabel(extractStep(e.id),v);_.attributes.set(J.label,y);let b=r.findIndex(e=>e.id===s);r.findIndex(e=>e.id===c)<b&&e.dir!==`back`&&_.attributes.apply({[J.minlen]:0});let[x,S]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(_.attributes.apply({[J.arrowtail]:toArrowType(x),[J.dir]:`back`}),S!==`none`&&_.attributes.apply({[J.arrowhead]:toArrowType(S),[J.minlen]:0}),_):x===`none`&&S===`none`||x!==`none`&&S!==`none`?(_.attributes.apply({[J.arrowhead]:toArrowType(x),[J.arrowtail]:toArrowType(S),[J.dir]:`both`}),_):x===`none`?(_.attributes.delete(J.arrowhead),_.attributes.apply({[J.arrowtail]:toArrowType(S),[J.minlen]:0,[J.dir]:`back`}),_):(_.attributes.set(J.arrowhead,toArrowType(x)),_)}};const va=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=N(e.children,F(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),D(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3;break}let s=nonNullable(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),c=null;xe(t,r).forEach(e=>{let t=e.length>1?s.createSubgraph({[J.rank]:`same`}):null;e.forEach((e,r)=>{let u=this.getGraphNode(e.id);u&&(t?.node(u.id),r===0&&(c&&s.edge([c,u],{[J.style]:`invis`}),c=u))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let s=this.G.createSubgraph({[J.rank]:r.type});e.forEach(e=>s.node(e.id)),t+=1,va.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,s]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[c,u,d]=this.edgeEndpoint(r,e=>Te(e)),[m,h,g]=this.edgeEndpoint(s,Ie),_=e.parent,v=this.graphology.getEdgeAttributes(e.id),y=t.edge([u,h],{[J.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&y.attributes.set(J.style,e.line),g&&y.attributes.set(J.lhead,g),d&&y.attributes.set(J.ltail,d);let b=p(g)||p(d),x=edgelabel(e);if(x&&y.attributes.set(b?J.xlabel:J.label,x),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;y.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&v.weight>1&&y.attributes.set(J.weight,v.weight);let[S,w]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return y.attributes.apply({[J.arrowtail]:toArrowType(S),[J.dir]:`back`}),w!==`none`&&y.attributes.apply({[J.arrowhead]:toArrowType(w),[J.dir]:`both`,[J.minlen]:0}),y;if(S===`none`&&w===`none`)return y.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`,[J.minlen]:0,[J.constraint]:!1}),y;if(S!==`none`&&w!==`none`)return y.attributes.apply({[J.arrowhead]:toArrowType(S),[J.arrowtail]:toArrowType(w),[J.dir]:`both`}),y;if(y.attributes.set(J.arrowhead,toArrowType(S)),w!==`none`&&y.attributes.set(J.arrowtail,toArrowType(w)),this.view.edges.length===1)return y;let T;return T=_===null&&c.parent==null&&m.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 r=this.computedNode(t.source),s=this.computedNode(t.target);return isCompound(r)||isCompound(s)?!1:r.parent==null&&s.parent==null}):this.findInternalEdges(_).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),T.length===0&&(_===null||this.leafElements(_).length<=3)&&y.attributes.set(J.minlen,0),y}};function parseBB(e){let[t,r,s,c]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],u=Math.round(s-t),d=Math.round(r-c);return{x:Math.round(t),y:Math.round(c),width:u,height:d}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),s=inchToPx(parseFloat(e.width)),c=inchToPx(parseFloat(e.height));return{x:t-Math.round(s/2),y:r-Math.round(c/2),width:s,height:c}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let s=1/0,c=1/0,u=-1/0,d=-1/0,p=13;try{for(let m of e){if(m.op===`F`){p=pointToPx(m.size);continue}if(m.op===`T`){let e=pointToPx(m.pt[0])-t,h=pointToPx(m.width);switch(m.align){case`r`:e-=h;break;case`c`:e-=Math.round(h/2);break}s=Math.min(s,e),u=Math.max(u,e+h);let g=pointToPx(m.pt[1])-r;c=Math.min(c,Math.round(g-p)),d=Math.max(d,g)}}}catch(t){return la.warn(`Failed on parsing label draw ops:
32
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return s===1/0?null:{x:s-2,y:c-2,width:u-s+4,height:d-c+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let s=e.filter(e=>e.op.toLowerCase()===`b`);invariant(P(s,1),`view ${r} edge ${t} should have at least one bezier draw op`),s.length>1&&la.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let c=s[0].points.map(e=>pointToPx(e));return invariant(P(c,2),`view ${r} edge ${t} should have at least two points`),c}catch(s){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:s})}}function parseGraphvizEdge(e,{id:t,source:r,target:s,dir:c,label:u,description:d,...p},m){let h=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),g=e.dir===`back`||c===`back`;return u=u&&h?wrap(u,{maxchars:40,maxLines:5}).join(`
33
- `):null,{id:t,source:r,target:s,label:u,...T(d)&&{description:d},points:parseEdgePoints(e,m),labelBBox:h,...g?{dir:`back`}:{},...p}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:s,edges:c,hasManualLayout:u,...d}=t,p=[],m=[],h;if(h=d._type===`dynamic`?{...d,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:r},[Ri]:`layouted`,bounds:r,nodes:p,edges:m}:{...d,[Ri]:`layouted`,bounds:r,nodes:p,edges:m},u){let e=h;e[Bi]=`auto`}let g=e.objects??[];for(let e of s){let t=g.find(t=>t.likec4_id===e.id);invariant(t,`View ${d.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:s,width:c,height:u}=`bb`in t?parseBB(t.bb):parseNode(t),d=[r,s];p.push({...e,x:r,y:s,width:c,height:u,labelBBox:parseLabelBbox(t._ldraw_,d)??{x:r,y:s,width:c,height:u}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let _=e.edges??[];for(let e of c){let t=_.find(t=>t.likec4_id===e.id);if(!t){la.warn`View ${d.id} edge ${e.id} not found in graphviz output, skipping`;continue}m.push(parseGraphvizEdge(t,e,d.id))}return h}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var ya=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,Ji.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[J.nodesep]:pxToInch(100),[J.ranksep]:pxToInch(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 r=nonNullable(this.getGraphNode(e.source),`Node not found for ${e.source}`),s=nonNullable(this.getGraphNode(e.target),`Node not found for ${e.target}`),c=this.graphology.getEdgeAttributes(e.id),u=t.edge([r,s],{[J.likec4_id]:e.id,[J.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&u.attributes.set(J.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&c.weight>1&&u.attributes.set(J.weight,c.weight);let d=edgelabel(e);if(d&&u.attributes.set(J.label,d),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;u.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}return u}},Node=class{value;next;constructor(e){this.value=e}},Queue=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Node(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function pLimit(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),validateConcurrency(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let r=new Queue,s=0,resumeNext=()=>{s<e&&r.size>0&&(s++,r.dequeue().run())},next=()=>{s--,resumeNext()},run=async(e,t,r)=>{let s=(async()=>e(...r))();t(s);try{await s}catch{}next()},enqueue=(t,c,u,d)=>{let p={reject:u};new Promise(e=>{p.run=e,r.enqueue(p)}).then(run.bind(void 0,t,c,d)),s<e&&resumeNext()},generator=(e,...t)=>new Promise((r,s)=>{enqueue(e,r,s,t)});return Object.defineProperties(generator,{activeCount:{get:()=>s},pendingCount:{get:()=>r.size},clearQueue:{value(){if(!t){r.clear();return}let e=AbortSignal.abort().reason;for(;r.size>0;)r.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){validateConcurrency(t),e=t,queueMicrotask(()=>{for(;s<e&&r.size>0;)resumeNext()})}},map:{async value(e,t){let r=Array.from(e,(e,r)=>this(t,e,r));return Promise.all(r)}}}),generator}function validateConcurrency(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const ba=pLimit(1);var xa=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){si.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await ba(async()=>{let s=la.getChild([`layouter`,`wasm`,e,`_`,De(4).toLowerCase()]);try{s.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,s.trace`reached 20 operations, unloading wasm`,si.unload()),e}catch(e){s.trace(`FAILED DOT
34
- `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;s.warn(r),GraphvizWasmAdapter.opsCount=0,si.unload()}return s.warn(`Retrying...`),await delay(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await si.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await si.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await si.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await si.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case isDynamicView$1(e):return new DynamicViewPrinter(e,t);case isDeploymentView$1(e):return new DeploymentViewPrinter(e,t);case isElementView$1(e):return new ElementViewPrinter(e,t);default:nonexhaustive(e)}},Sa=la.getChild(`layouter`);function normalizeDot(e){return e.split(`
29
+ `&&(e=e.slice(0,e.length-1)),u(e)}).join(c);return t.trim===!0&&(m=trimTabAndSpaces(m)),m};function identity(e){return e}}))(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(invariant(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(invariant(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Ft(It(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Ft(Pt(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:s=ue()}){let c=(0,Ta.default)(e,{width:t,indent:``,escape:s}).split(`
30
+ `);return _(r)&&r>0&&c.length>r&&(c=c.slice(0,r)),c}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:s,bold:c,color:u}){let d=wrap(e,{maxchars:t,maxLines:s,sanitize}).join(`<BR/>`);c&&(d=`<B>${d}</B>`);let p=u?` COLOR="${u}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${p}>${d}</FONT>`}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:nonexhaustive(e)}}function nodeLabel(e,t){let{sizes:{size:r},values:s}=t.nodeSizes(e.style),c=t.colors(e.color).elements,u=[`sm`,`xs`].includes(r),d=x(e.icon),p=e.style.iconPosition??`left`,m=d&&(p===`left`||p===`right`),h=[wrapWithFont({text:e.title,fontsize:s.textSize,maxchars:maxchars(r),maxLines:u?1:3})];if(r!==`xs`){x(e.technology?.trim())&&h.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(s.textSize*.65),maxchars:m?35:45,maxLines:1,color:c.loContrast}));let t=ca.from(e.description).text;t&&h.push(wrapWithFont({text:t,fontsize:Math.ceil(s.textSize*.75),maxchars:m?35:45,maxLines:u?3:5,color:c.loContrast}))}if(h.length===1&&d===!1)return`<${h[0]}>`;let g=m?(t,r,c)=>{let u=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=c.length>1?` ROWSPAN="${c.length}"`:``,r=Math.ceil(s.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),p===`right`?(u=`<TD${t} WIDTH="16"> </TD>${u}`,u=`${u}<TD${t} WIDTH="${r}"> </TD>`):(u=`<TD${t} WIDTH="${r}"> </TD>${u}`,u=`${u}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${u}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,_=h.map(g).join(``);if(d&&(p===`top`||p===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(s.iconSize+8)}"> </TD></TR>`;_=p===`top`?`${e}${_}`:`${_}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${_}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const Ea=`BGCOLOR="${ea.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=[];if(x(e?.trim())&&r.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),x(t?.trim())&&r.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),r.length===0)return null;let s=r.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``);return`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Ea}>${s}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${Ea}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return x(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${Ea} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}var Da=ct(),Oa=e(lt(),1);const ka=`Arial`,Aa=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new P.default(e=>nonNullable(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=Aa;graphology=new Lt({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).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`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let s=-1;e!==null&&r!==null&&(s=hierarchyDistance(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:s,weight:1}),s>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:s}),s>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:s})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,s,c,u)=>{let d=Math.max(c.maxConnectedHierarchyDistance,u.maxConnectedHierarchyDistance);if(d>t)this.graphology.mergeEdgeAttributes(e,{weight:d-t+1});else{let c=this.graphology.directedDegree(r),u=this.graphology.directedDegree(s);c===1&&u===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}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){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))N(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),s=this.elementToNode(r,e.node(t));this.nodes.set(r.id,s)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),s=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,s);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,s);else{let t=this.getGraphNode(e.id);t&&s.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(J.rank))&&this.G.set(J.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,r=wa({[J.likec4_viewId]:this.view.id,[J.bgcolor]:`transparent`,[J.layout]:`dot`,[J.compound]:!0,[J.rankdir]:t,[J.TBbalance]:`min`,[J.splines]:`spline`,[J.outputorder]:`nodesfirst`,[J.nodesep]:pxToInch(e.nodeSep??110),[J.ranksep]:pxToInch(e.rankSep??120),[J.pad]:pxToInch(15),[J.fontname]:ka});return r.attributes.graph.apply({[J.fontsize]:pxToPoints(this.styles.fontSize()),[J.labeljust]:t===`RL`?`r`:`l`,[J.labelloc]:t===`BT`?`b`:`t`,[J.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[J.fontname]:ka,[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]:ka,[J.fontsize]:pxToPoints(14),[J.penwidth]:pxToPoints(2),[J.color]:t.line,[J.fontcolor]:t.label,[J.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?!1:(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=nameFromFqn(e.id).toLowerCase(),s=this.reserveNodeId(r,t),c=1;for(;s===!1;)s=this.reserveNodeId(r+`_`+c++,t);return s}elementToSubgraph(e,t){invariant(isCompound(e),`node should be compound`),invariant(ie(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,s=compoundLabelColor(r.loContrast);return t.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.likec4_depth]:e.depth,[J.fillcolor]:compoundColor(r.fill,e.depth),[J.color]:compoundColor(r.stroke,e.depth),[J.style]:`filled`,[J.margin]:pxToPoints(e.children.length>1?40:32)}),E(e.title.trim())||t.set(J.label,compoundLabel(e,s)),t}elementToNode(e,t){invariant(!isCompound(e),`node should not be compound`);let r=x(e.icon),{values:{padding:s,sizes:{width:c,height:u}}}=this.styles.nodeSizes(e.style),d=r?8:s;if(t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.label]:nodeLabel(e,this.styles),[J.margin]:`${pxToInch(d)},${pxToInch(s)}`}),t.attributes.set(J.width,pxToInch(c)),t.attributes.set(J.height,pxToInch(u)),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[J.fillcolor]:r.fill,[J.fontcolor]:r.hiContrast,[J.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[J.margin]:`${pxToInch(d)},${pxToInch(0)}`,[J.penwidth]:pxToPoints(2),[J.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s+6)}`});break;case`mobile`:t.attributes.apply({[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s)}`});break;case`queue`:t.attributes.apply({[J.width]:pxToInch(c),[J.height]:pxToInch(u-8),[J.margin]:`${pxToInch(r?d:d+4)},${pxToInch(s)}`});break;case`component`:t.attributes.apply({[J.width]:pxToInch(c+10),[J.margin]:`${pxToInch(d+20)},${pxToInch(s)}`});break;default:break}return t}leafElements(e){return e===null?M([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),s=this.getGraphNode(e),c;return s?[r,s,void 0]:(invariant(isCompound(r),`endpoint node should be compound`),c=this.getSubgraph(e)?.id,invariant(c,`subgraph ${e} not found`),r=nonNullable(t(this.leafElements(e)),`leaf element in ${e} not found`),s=nonNullable(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,s,c])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return k(this.descendants(e),A(e=>fe(e.inEdges,e.outEdges)),pe(),Ne(fe(t.inEdges,t.outEdges)),w(e=>this.view.edges.find(t=>t.id===e)),M(x))}assignGroups(){let e=k(this.view.nodes,M(isCompound),w(e=>e.id),ye(compareFqnHierarchically),Se(),w(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),M(({edges:e})=>e.length>1&&e.length<8),_e(4)),t=new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let s of e)try{let e=nonNullable(this.getGraphNode(s.source),`Graphviz Node not found for ${s.source}`),c=nonNullable(this.getGraphNode(s.target),`Graphviz Node not found for ${s.target}`);t.add(s.source),t.add(s.target),e.attributes.set(J.group,r.id),c.attributes.set(J.group,r.id)}catch(e){Aa.error(`Failed to assign group to edge ${s.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(J.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let s=e.findIndex(e=>e.id===r);s!==-1&&t.push(...e.splice(s,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let s=e.findIndex(e=>e.id===r);s!==-1&&t.push(...e.splice(s,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(ce);if(r.length===0||t.rank===`same`&&r.length===1)continue;let s=e.createSubgraph({[J.rank]:t.rank});for(let e of r)s.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[s,c]=r?[e.target,e.source]:[e.source,e.target],[,u,d]=this.edgeEndpoint(s,e=>ke(e)),[,p,m]=this.edgeEndpoint(c,Ue),h=t.edge([u,p],{[J.likec4_id]:e.id});e.line&&e.line!==`dashed`&&h.attributes.set(J.style,e.line),m&&h.attributes.set(J.lhead,m),d&&h.attributes.set(J.ltail,d);let g=ce(m)||ce(d),_=edgelabel(e);if(_&&h.attributes.set(g?J.xlabel:J.label,_),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;h.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let v=this.aiHints.edgeWeight[e.id];v!==void 0&&v!==1&&h.attributes.set(J.weight,v);let y=this.aiHints.edgeMinlen[e.id];return y!==void 0&&y!==1&&h.attributes.set(J.minlen,y),this.aiHints.excludeFromRanking?.includes(e.id)&&h.attributes.set(J.constraint,!1),r&&h.attributes.set(J.dir,`back`),h}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...s}of this.aiHints.invisibleEdges){let c=this.getGraphNode(t),u=this.getGraphNode(r);if(!c||!u)continue;let d=`invisible_${t}->${r}`;if(this.edges.has(d)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${d}, skipping creation`;continue}this.graphology.addEdgeWithKey(d,t,r,{hierarchyDistance:0,origin:`invisible`,weight:s.weight??1});let p=e.edge([c,u],{[J.style]:`invis`});this.edges.set(d,p),s.minlen!==void 0&&s.minlen!==1&&p.attributes.set(J.minlen,s.minlen),s.weight!==void 0&&s.weight!==1&&p.attributes.set(J.weight,s.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return ie(e.rankSep)||!(be(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(J.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(J.TBbalance),e.apply({[J.nodesep]:pxToInch(t.nodeSep??130),[J.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return k(this.view.nodes,w(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),re(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Be(),w(e=>e),Ve(t=>{t.length<2||e.subgraph({[J.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(nonNullable(r).id)})}),Ie(()=>{e.set(J.newrank,!0),e.set(J.clusterrank,`global`),e.delete(J.pack),e.delete(J.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(J.margin,pxToPoints(50)),r}addEdge(e,t){let[r,s]=[e.source,e.target],[c,u,d]=this.edgeEndpoint(r,e=>ke(e)),[p,m,h]=this.edgeEndpoint(s,Ue),g=ce(h)||ce(d),_=t.edge([u,m],{[J.likec4_id]:e.id,[J.style]:e.line??`dashed`});h&&_.attributes.set(J.lhead,h),d&&_.attributes.set(J.ltail,d);let v=this.graphology.getEdgeAttribute(e.id,`weight`);v>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&_.attributes.set(J.weight,v);let y=edgelabel(e);if(y&&_.attributes.set(g?J.xlabel:J.label,y),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let[b,ee]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return b===`none`&&ee===`none`?(_.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`}),_):e.dir===`both`?(_.attributes.apply({[J.arrowhead]:toArrowType(b),[J.arrowtail]:toArrowType(e.tail??b),[J.dir]:`both`}),!g&&c.modelRef!==p.modelRef&&_.attributes.set(J.constraint,!1),_):(b&&_.attributes.set(J.arrowhead,toArrowType(b)),ee!==`none`&&_.attributes.set(J.arrowtail,toArrowType(ee)),_)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(J.TBbalance),e.set(J.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[s,c]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[u,d,p]=this.edgeEndpoint(s,e=>ke(e)),[m,h,g]=this.edgeEndpoint(c,Ue),_=t.edge([d,h],{[J.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&_.attributes.set(J.style,e.line),g&&_.attributes.set(J.lhead,g),p&&_.attributes.set(J.ltail,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let v=[e.label?.trim(),e.technology?.trim()].filter(x).join(`
31
+ `),y=stepEdgeLabel(this.view.edges.indexOf(e),v);_.attributes.set(J.label,y);let b=r.findIndex(e=>e.id===s);r.findIndex(e=>e.id===c)<b&&e.dir!==`back`&&_.attributes.apply({[J.minlen]:0});let[ee,te]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(_.attributes.apply({[J.arrowtail]:toArrowType(ee),[J.dir]:`back`}),te!==`none`&&_.attributes.apply({[J.arrowhead]:toArrowType(te),[J.minlen]:0}),_):ee===`none`&&te===`none`||ee!==`none`&&te!==`none`?(_.attributes.apply({[J.arrowhead]:toArrowType(ee),[J.arrowtail]:toArrowType(te),[J.dir]:`both`}),_):ee===`none`?(_.attributes.delete(J.arrowhead),_.attributes.apply({[J.arrowtail]:toArrowType(te),[J.minlen]:0,[J.dir]:`back`}),_):(_.attributes.set(J.arrowhead,toArrowType(ee)),_)}};const ja=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=k(e.children,M(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),w(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3;break}let s=nonNullable(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),c=null;$e(t,r).forEach(e=>{let t=e.length>1?s.createSubgraph({[J.rank]:`same`}):null;e.forEach((e,r)=>{let u=this.getGraphNode(e.id);u&&(t?.node(u.id),r===0&&(c&&s.edge([c,u],{[J.style]:`invis`}),c=u))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let s=this.G.createSubgraph({[J.rank]:r.type});e.forEach(e=>s.node(e.id)),t+=1,ja.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,s]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[c,u,d]=this.edgeEndpoint(r,e=>ke(e)),[p,m,h]=this.edgeEndpoint(s,Ue),g=e.parent,_=this.graphology.getEdgeAttributes(e.id),v=t.edge([u,m],{[J.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&v.attributes.set(J.style,e.line),h&&v.attributes.set(J.lhead,h),d&&v.attributes.set(J.ltail,d);let y=ce(h)||ce(d),b=edgelabel(e);if(b&&v.attributes.set(y?J.xlabel:J.label,b),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;v.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&_.weight>1&&v.attributes.set(J.weight,_.weight);let[ee,te]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return v.attributes.apply({[J.arrowtail]:toArrowType(ee),[J.dir]:`back`}),te!==`none`&&v.attributes.apply({[J.arrowhead]:toArrowType(te),[J.dir]:`both`,[J.minlen]:0}),v;if(ee===`none`&&te===`none`)return v.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`,[J.minlen]:0,[J.constraint]:!1}),v;if(ee!==`none`&&te!==`none`)return v.attributes.apply({[J.arrowhead]:toArrowType(ee),[J.arrowtail]:toArrowType(te),[J.dir]:`both`}),v;if(v.attributes.set(J.arrowhead,toArrowType(ee)),te!==`none`&&v.attributes.set(J.arrowtail,toArrowType(te)),this.view.edges.length===1)return v;let x;return x=g===null&&c.parent==null&&p.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 r=this.computedNode(t.source),s=this.computedNode(t.target);return isCompound(r)||isCompound(s)?!1:r.parent==null&&s.parent==null}):this.findInternalEdges(g).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),x.length===0&&(g===null||this.leafElements(g).length<=3)&&v.attributes.set(J.minlen,0),v}};function parseBB(e){let[t,r,s,c]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],u=Math.round(s-t),d=Math.round(r-c);return{x:Math.round(t),y:Math.round(c),width:u,height:d}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),s=inchToPx(parseFloat(e.width)),c=inchToPx(parseFloat(e.height));return{x:t-Math.round(s/2),y:r-Math.round(c/2),width:s,height:c}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let s=1/0,c=1/0,u=-1/0,d=-1/0,p=13;try{for(let m of e){if(m.op===`F`){p=pointToPx(m.size);continue}if(m.op===`T`){let e=pointToPx(m.pt[0])-t,h=pointToPx(m.width);switch(m.align){case`r`:e-=h;break;case`c`:e-=Math.round(h/2);break}s=Math.min(s,e),u=Math.max(u,e+h);let g=pointToPx(m.pt[1])-r;c=Math.min(c,Math.round(g-p)),d=Math.max(d,g)}}}catch(t){return xa.warn(`Failed on parsing label draw ops:
32
+ {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return s===1/0?null:{x:s-2,y:c-2,width:u-s+4,height:d-c+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let s=e.filter(e=>e.op.toLowerCase()===`b`);invariant(j(s,1),`view ${r} edge ${t} should have at least one bezier draw op`),s.length>1&&xa.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let c=s[0].points.map(e=>pointToPx(e));return invariant(j(c,2),`view ${r} edge ${t} should have at least two points`),c}catch(s){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:s})}}function parseGraphvizEdge(e,{id:t,source:r,target:s,dir:c,label:u,description:d,...p},m){let h=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),g=e.dir===`back`||c===`back`;return u=u&&h?wrap(u,{maxchars:40,maxLines:5}).join(`
33
+ `):null,{id:t,source:r,target:s,label:u,...x(d)&&{description:d},points:parseEdgePoints(e,m),labelBBox:h,...g?{dir:`back`}:{},...p}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:s,edges:c,hasManualLayout:u,...d}=t,p=[],m=[],h;if(h=d._type===`dynamic`?{...d,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],subflows:[],steps:[],bounds:r},[Wi]:`layouted`,bounds:r,nodes:p,edges:m}:{...d,[Wi]:`layouted`,bounds:r,nodes:p,edges:m},u){let e=h;e[Ki]=`auto`}let g=e.objects??[];for(let e of s){let t=g.find(t=>t.likec4_id===e.id);invariant(t,`View ${d.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:s,width:c,height:u}=`bb`in t?parseBB(t.bb):parseNode(t),d=[r,s];p.push({...e,x:r,y:s,width:c,height:u,labelBBox:parseLabelBbox(t._ldraw_,d)??{x:r,y:s,width:c,height:u}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let _=e.edges??[];for(let e of c){let t=_.find(t=>t.likec4_id===e.id);if(!t){xa.warn`View ${d.id} edge ${e.id} not found in graphviz output, skipping`;continue}m.push(parseGraphvizEdge(t,e,d.id))}return h}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var Ma=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,ea.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[J.nodesep]:pxToInch(100),[J.ranksep]:pxToInch(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 r=nonNullable(this.getGraphNode(e.source),`Node not found for ${e.source}`),s=nonNullable(this.getGraphNode(e.target),`Node not found for ${e.target}`),c=this.graphology.getEdgeAttributes(e.id),u=t.edge([r,s],{[J.likec4_id]:e.id,[J.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&u.attributes.set(J.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&c.weight>1&&u.attributes.set(J.weight,c.weight);let d=edgelabel(e);if(d&&u.attributes.set(J.label,d),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;u.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}return u}},Node=class{value;next;constructor(e){this.value=e}},Queue=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Node(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function pLimit(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),validateConcurrency(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let r=new Queue,s=0,resumeNext=()=>{s<e&&r.size>0&&(s++,r.dequeue().run())},next=()=>{s--,resumeNext()},run=async(e,t,r)=>{let s=(async()=>e(...r))();t(s);try{await s}catch{}next()},enqueue=(t,c,u,d)=>{let p={reject:u};new Promise(e=>{p.run=e,r.enqueue(p)}).then(run.bind(void 0,t,c,d)),s<e&&resumeNext()},generator=(e,...t)=>new Promise((r,s)=>{enqueue(e,r,s,t)});return Object.defineProperties(generator,{activeCount:{get:()=>s},pendingCount:{get:()=>r.size},clearQueue:{value(){if(!t){r.clear();return}let e=AbortSignal.abort().reason;for(;r.size>0;)r.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){validateConcurrency(t),e=t,queueMicrotask(()=>{for(;s<e&&r.size>0;)resumeNext()})}},map:{async value(e,t){let r=Array.from(e,(e,r)=>this(t,e,r));return Promise.all(r)}}}),generator}function validateConcurrency(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const Na=pLimit(1);var Pa=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ti.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await Na(async()=>{let s=xa.getChild([`layouter`,`wasm`,e,`_`,Me(4).toLowerCase()]);try{s.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,s.trace`reached 20 operations, unloading wasm`,ti.unload()),e}catch(e){s.trace(`FAILED DOT
34
+ `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;s.warn(r),GraphvizWasmAdapter.opsCount=0,ti.unload()}return s.warn(`Retrying...`),await delay(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ti.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ti.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ti.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ti.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case isDynamicView$1(e):return new DynamicViewPrinter(e,t);case isDeploymentView$1(e):return new DeploymentViewPrinter(e,t);case isElementView$1(e):return new ElementViewPrinter(e,t);default:nonexhaustive(e)}},Fa=xa.getChild(`layouter`);function normalizeDot(e){return e.split(`
35
35
  `).filter(e=>!(e.includes(`margin`)&&e.includes(`50.1`))).join(`
36
- `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new xa,Sa.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,Sa.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return Sa.getChild([e,`_`,De(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
37
- `+e),r}try{return JSON.parse(r)}catch(s){throw t.error(loggable(s)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,s}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:s}=e,c=parseGraphvizJson(await this.dotToJson(r),s);return isDynamicView$1(c)&&Object.assign(c,{sequenceLayout:calcSequenceLayout(c)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:c}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let s=this.newScopedLogger(`ai-layout`);try{s.trace`layouting view ${e.id} using AI hints...`;let c=new AiLayoutViewPrinter(e,t,r).print(),u=parseGraphvizJson(await this.dotToJson(c),e);return isDynamicView$1(u)&&Object.assign(u,{sequenceLayout:calcSequenceLayout(u)}),c=normalizeDot(c),s.trace`layouting view ${e.id} done`,{dot:c,diagram:u}}catch(t){throw s.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!isElementView$1(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new ya(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let s=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(s,e)}};const Ca=la.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new It({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=Ca.getChild([`run`,De(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await promiseNextTick(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),Ca.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,Ca.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){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=Ca.getChild([`batch`,De(3)]);if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),await promiseNextTick(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));let r=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${r}`,this.isProcessingBatch=!0;let s=[];try{for(let c of e.batch)if(t.trace`add task for view ${c.view.id}`,this.queue.add(async()=>(r<=2&&await promiseNextTick(),await super.layout(c))).then(t=>{if(!t){e.onError?.(c,Error(`Layout queue returned null for view ${c.view.id}`));return}s.push(t),e.onSuccess?.(c,t)}).catch(r=>{t.error(`Fail layout view ${c.view.id}`,{err:r}),e.onError?.(c,r)}),await this.waitForQueueToShrink(r,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}}finally{let e=this.queue.pending+this.queue.size;e>0&&(t.trace`waiting ${e} tasks to finish`,await this.queue.onIdle()),t.debug`batch layout done`,this.isProcessingBatch=!1}return s}async waitForQueueToShrink(e=this.queue.concurrency,t=Ca){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},ElementModel=class{$model;$element;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[r,s]=splitGlobalFqn(this.id);r?(this.imported={from:r,fqn:s},this.hierarchyLevel=hierarchyLevel(s)):(this.imported=null,this.hierarchyLevel=hierarchyLevel(this.id))}get name(){return nameFromFqn(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 memoizeProp(this,Symbol.for(`tags`),()=>le([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get metadata(){return this.$element.metadata??{}}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!ee(this.$element.summary,this.$element.description)}get summary(){return Zi.memoize(this,`summary`,preferSummary(this.$element))}get description(){return Zi.memoize(this,`description`,preferDescription(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return memoizeProp(this,Symbol.for(`defaultView`),()=>ihead(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return memoizeProp(this,`style`,()=>exact({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 isAncestor(this,e)}isDescendantOf(e){return isAncestor(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=commonAncestor(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?sortNaturalByFqn([...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 r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.target)}get allOutgoing(){return memoizeProp(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return memoizeProp(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 memoizeProp(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 T(ihead(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!j(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},AbstractDeploymentElementModel=class{Aux;get style(){return memoizeProp(this,`style`,()=>exact({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 nameFromFqn(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Zi.memoize(this,`summary`,preferSummary(this.$node))}get description(){return Zi.memoize(this,`description`,preferDescription(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=commonAncestor(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 r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.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 memoizeProp(this,Symbol.for(`allOutgoing`),()=>wa.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>wa.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!j(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},DeploymentNodeModel=class extends AbstractDeploymentElementModel{$model;$node;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=hierarchyLevel(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get metadata(){return this.$node.metadata??{}}get tags(){return memoizeProp(this,Symbol.for(`tags`),()=>le([...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=ihead(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 r of this.instances()){for(let t of r.element.outgoing())e.add(t);for(let e of r.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 intersection(t,e)}},DeployedInstanceModel=class extends AbstractDeploymentElementModel{$model;$instance;element;id;_literalId;title;hierarchyLevel;constructor(e,t,r){super(),this.$model=e,this.$instance=t,this.element=r,this.id=t.id,this._literalId=t.id,this.title=t.title??r.title,this.hierarchyLevel=hierarchyLevel(t.id)}get $node(){return this.$instance}get parent(){return nonNullable(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return memoizeProp(this,`style`,()=>exact({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 memoizeProp(this,Symbol.for(`tags`),()=>le([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return Zi.memoize(this,`summary`,preferSummary(this.$instance)??preferSummary(this.element.$element))}get description(){return Zi.memoize(this,`description`,preferDescription(this.$instance)??preferDescription(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)}}},NestedElementOfDeployedInstanceModel=class{instance;element;constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return memoizeProp(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}},DeploymentRelationModel=class{$model;$relationship;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 r=commonAncestor(this.source.id,this.target.id);this.boundary=r?this.$model.node(r):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return T(this.$relationship.title)?this.$relationship.title:null}get technology(){return y(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&&!ee(this.$relationship.summary,this.$relationship.description)}get summary(){return Zi.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return Zi.memoize(this,`description`,preferDescription(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}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&&!j(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},wa=class RelationshipsAccum{model;deployment;static empty(){return new RelationshipsAccum}static from(e,t){return new RelationshipsAccum(new Set(e),new Set(t))}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(e){return RelationshipsAccum.from(intersection(this.model,e.model),intersection(this.deployment,e.deployment))}difference(e){return RelationshipsAccum.from(difference(this.model,e.model),difference(this.deployment,e.deployment))}union(e){return RelationshipsAccum.from(union(this.model,e.model),union(this.deployment,e.deployment))}};const getId=e=>typeof e==`string`?e:e.id,splitViewTitle=e=>{if(invariant(!e.includes(`
38
- `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return P(t,1)?t:[``]}return[e.trim()]},normalizeViewPath=e=>splitViewTitle(e).join(`/`),getViewFolderPath=e=>{let t=splitViewTitle(e);return P(t,2)?t.slice(0,-1).join(`/`):null},extractViewTitleFromPath=e=>e.includes(`/`)?splitViewTitle(e).pop()??e:e.trim();var LikeC4DeploymentModel=class{$model;#e=new Map;#t=new Map;#n=new L.default(()=>new Set);#r=new L.default(()=>new Set);#i=new Set;#a=new Map;#o=new L.default(()=>new Set);#s=new L.default(()=>new Set);#c=new L.default(()=>new Set);#l=new L.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,r=Fe(t.elements);for(let e of sortParentsFirst(r)){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 Fe(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 DeploymentNodeModel||e instanceof DeployedInstanceModel)return e;let t=getId(e);return nonNullable(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return invariant(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(invariant(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return invariant(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(invariant(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=getId(e),r=this.#r.get(t);r&&(yield*r)}deploymentRef(e){if(G.isInsideInstanceRef(e)){let{deployment:t,element:r}=e;return getOrCreate(this.#u,`${t}@${r}`,()=>new NestedElementOfDeployedInstanceModel(this.instance(t),this.$model.element(r)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=getId(e);return nonNullable(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=getId(e);return this.#t.get(t)||null}children(e){let t=getId(e);return this.#n.get(t)}*siblings(e){let t=getId(e),r=this.parent(e)?.children()??this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),r;for(;r=this.#t.get(t);)yield r,t=r.id}*descendants(e,t=`desc`){for(let r of this.children(e))t===`asc`?(yield r,yield*this.descendants(r.id)):(yield*this.descendants(r.id),yield r)}*incoming(e,t=`all`){let r=getId(e);for(let e of this.#o.get(r))switch(!0){case t===`all`:case t===`direct`&&e.target.id===r:case t===`to-descendants`&&e.target.id!==r:yield e;break}}*outgoing(e,t=`all`){let r=getId(e);for(let e of this.#s.get(r))switch(!0){case t===`all`:case t===`direct`&&e.source.id===r:case t===`from-descendants`&&e.source.id!==r:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=isDeploymentNode$1(e)?new DeploymentNodeModel(this,Object.freeze(e)):new DeployedInstanceModel(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let r=parentFqn(t.id);return r?(invariant(this.#e.has(r),`Parent ${r} of ${t.id} not found`),this.#t.set(t.id,this.node(r)),this.#n.get(r).add(t)):(invariant(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 DeploymentRelationModel(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 r=t.boundary?.id??null;if(r)for(let e of[r,...ancestorsFqn(r)])this.#c.get(e).add(t);for(let e of ancestorsFqn(t.source.id)){if(e===r)break;this.#s.get(e).add(t)}for(let e of ancestorsFqn(t.target.id)){if(e===r)break;this.#o.get(e).add(t)}return t}},RelationshipModel=class{model;$relationship;source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(G.flatten(t.source)),this.target=e.element(G.flatten(t.target));let r=commonAncestor(this.source.id,this.target.id);this.boundary=r?this.model.element(r):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return y(this.$relationship.title)?null:this.$relationship.title}get technology(){return y(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&&!ee(this.$relationship.summary,this.$relationship.description)}get summary(){return Zi.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return Zi.memoize(this,`description`,preferDescription(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 metadata(){return this.$relationship.metadata??{}}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&&!j(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},EdgeModel=class{source;target;Aux;$viewModel;$view;$edge;constructor(e,t,r,s){this.source=r,this.target=s,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 Zi.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()?extractStep(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 isStepEdgeId(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let r=this.$viewModel.$model.findRelationship(t,e);r&&(yield r)}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)}},NodeModel=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 Zi.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Zi.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 memoizeProp(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 r=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&r.target.id===this.id:case e===`to-descendants`&&r.target.id!==this.id:yield r;break}}}*incomers(e=`all`){let t=new Set;for(let r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let r=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&r.source.id===this.id:case e===`from-descendants`&&r.source.id!==this.id:yield r;break}}}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.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 T(this.$node.modelRef)}hasDeployment(){return T(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return isGroupElementKind(this.$node)}isTagged(e){return this.tags.includes(e)}},LikeC4ViewModel=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new L.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,r,s){this.$model=e,this.#e=r,this.id=r.id,this.folder=t,this.#c=s;for(let e of this.#e.nodes){let t=new NodeModel(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 EdgeModel(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=r.title?extractViewTitleFromPath(r.title):null,this.viewPath=r.title?normalizeViewPath(r.title):r.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[zi]}get stage(){return this.#e[Ri]}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 memoizeProp(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Zi.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?memoizeProp(this,`withDriftReasons`,()=>calcDriftsFromSnapshot(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?this.#e._layout===`manual`?this.#e:memoizeProp(this,`snapshotWithManualLayout`,()=>applyManualLayout(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=getId(e);return nonNullable(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(getId(e))??null}findNodeWithElement(e){let t=getId(e);return this.#i.has(t)?ifind(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=getId(e);return nonNullable(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(getId(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(getId(e))}includesDeployment(e){return this.#a.has(getId(e))}includesRelation(e){return this.#o.has(getId(e))}isComputed(){return this.#e[Ri]===`computed`}isLayouted(){return this.#e[Ri]===`layouted`}isDiagram(){return this.#e[Ri]===`layouted`}isElementView(){return this.#e[zi]===`element`}isScopedElementView(){return this.#e._type===`element`&&T(this.#e.viewOf)}isDeploymentView(){return this.#e[zi]===`deployment`}isDynamicView(){return this.#e[zi]===`dynamic`}},Ta=class LikeC4ViewsFolder{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,r){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Te(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=r}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return invariant(!this.isRoot,`Root view folder has no breadcrumbs`),memoizeProp(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return invariant(!this.isRoot,`Root view folder has no parent`),y(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return memoizeProp(this,`folders`,()=>{let e=[];for(let t of this.children)t instanceof LikeC4ViewsFolder&&e.push(t);return e})}get views(){return memoizeProp(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof LikeC4ViewModel&&e.push(t);return e})}},Ea=class LikeC4Model{Aux;_elements=new Map;_parents=new Map;_children=new L.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new L.default(()=>new Set);_outgoing=new L.default(()=>new Set);_internal=new L.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new L.default(()=>new Set);_allTags=new L.default(()=>new Set);static fromParsed(e){return new LikeC4Model(e)}static create(e){return new LikeC4Model(e)}static fromDump(e){let{_stage:t=`layouted`,projectId:r=`unknown`,project:s,globals:c,imports:u,deployments:d,views:p,relations:m,elements:h,specification:g}=e;return new LikeC4Model({[Ri]:t,projectId:r,project:s,globals:{predicates:c?.predicates??{},dynamicPredicates:c?.dynamicPredicates??{},styles:c?.styles??{}},imports:u??{},deployments:{elements:d?.elements??{},relations:d?.relations??{}},views:p??{},relations:m??{},elements:h??{},specification:g})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of Re(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,r]of Re(e.imports??{}))for(let e of sortParentsFirst(r)){let r=this.addImportedElement(t,e);for(let e of r.tags)this._allTags.get(e).add(r)}for(let t of Fe(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new LikeC4DeploymentModel(this),isOnStage(e,`computed`)||isOnStage(e,`layouted`)){let t=compareNaturalHierarchically(`/`),r=N(Fe(e.views),D(e=>({view:e,path:normalizeViewPath(e.title??e.id),folderPath:e.title&&getViewFolderPath(e.title)||``})),me((e,r)=>t(e.folderPath,r.folderPath))),getOrCreateFolder=e=>{let t=this._viewFolders.get(e);if(!t){let s=Ee(e,`/`);invariant(P(s,1),`View group path "${e}" must have at least one element`);let c;c=e===``?r.find(e=>e.view.id===`index`):r.find(t=>t.path===e),t=new Ta(this,s,c?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=getOrCreateFolder(``);for(let{folderPath:e}of r)this._viewFolders.has(e)||Ee(e,`/`).reduce((e,t)=>{let r=e.join(`/`),s=getOrCreateFolder(j(r)?t:r+`/`+t);return this._viewFolderItems.get(r).add(s),e.push(t),e},[]);for(let{view:t,folderPath:s}of r){let r=new LikeC4ViewModel(this,getOrCreateFolder(s),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(s).add(r),this._views.set(t.id,r);for(let e of r.tags)this._allTags.get(e).add(r)}}else this._rootViewFolder=new Ta(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 memoizeProp(this,`styles`,()=>Ji.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[Ri]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??memoizeProp(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return memoizeProp(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof ElementModel)return e;let t=getId(e);return nonNullable(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(getId(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 r=getId(e),s=this._relations.get(r)??null;return s||t===`model`?nonNullable(s,`Model relation ${r} not found`):nonNullable(this.deployment.findRelationship(r),`No model/deployment relation ${r} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let r=this._relations.get(getId(e))??null;return r||t===`model`?r:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=getId(e);return nonNullable(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 nonNullable(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return invariant(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=getId(e);return this._parents.get(t)||null}children(e){let t=getId(e);return this._children.get(t)}*siblings(e){let t=getId(e),r=this._parents.get(t),s=r?this._children.get(r.id).values():this.roots();for(let e of s)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),r;for(;r=this._parents.get(t);)yield r,t=r.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let r=getId(e);for(let e of this._incoming.get(r))switch(!0){case t===`all`:case t===`direct`&&e.target.id===r:case t===`to-descendants`&&e.target.id!==r:yield e;break}}*outgoing(e,t=`all`){let r=getId(e);for(let e of this._outgoing.get(r))switch(!0){case t===`all`:case t===`direct`&&e.source.id===r:case t===`from-descendants`&&e.source.id!==r:yield e;break}}get tags(){return memoizeProp(this,`tags`,()=>me([...this._allTags.keys()],compareNatural))}get tagsSortedByUsage(){return memoizeProp(this,`tagsSortedByUsage`,()=>N([...this._allTags.entries()],D(([e,t])=>({tag:e,count:t.size,tagged:t})),me((e,t)=>compareNatural(e.tag,t.tag)),Be([M(`count`),`desc`])))}findByTag(e,t){return ifilter(this._allTags.get(e),e=>t===`elements`?e instanceof ElementModel:t===`views`?e instanceof LikeC4ViewModel:t===`relationships`?e instanceof RelationshipModel:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=whereOperatorAsPredicate(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=whereOperatorAsPredicate(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 ElementModel(this,Object.freeze(e));this._elements.set(t.id,t);let r=parentFqn(t.id);return r?(invariant(this._elements.has(r),`Parent ${r} of ${t.id} not found`),this._parents.set(t.id,this.element(r)),this._children.get(r).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){invariant(!isGlobalFqn(t.id),`Imported element already has global FQN`);let r=GlobalFqn(e,t.id);if(this._elements.has(r))throw Error(`Element ${r} already exists`);let s=new ElementModel(this,Object.freeze({...t,id:r}));this._elements.set(s.id,s);let c=parentFqn(s.id);for(;c;){if(c.includes(`.`)&&this._elements.has(c))return this._parents.set(s.id,this.element(c)),this._children.get(c).add(s),s;c=parentFqn(c)}return this._rootElements.add(s),s}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new RelationshipModel(this,Object.freeze(e)),{source:r,target:s}=t;this._relations.set(t.id,t),this._incoming.get(s.id).add(t),this._outgoing.get(r.id).add(t);let c=commonAncestor(r.id,s.id);if(c)for(let e of[c,...ancestorsFqn(c)])this._internal.get(e).add(t);for(let e of ancestorsFqn(r.id)){if(e===c)break;this._outgoing.get(e).add(t)}for(let e of ancestorsFqn(s.id)){if(e===c)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Ea.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Ea||={});let Da;(function(e){e.isInside=e=>t=>isAncestor(e,t.source.id)&&isAncestor(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>r=>(r.source.id===e||isAncestor(e,r.source.id))&&(r.target.id===t||isAncestor(t,r.target.id));e.isAnyBetween=(e,r)=>{let s=t(e,r),c=t(r,e);return e=>s(e)||c(e)};let r=e.isIncoming=e=>t=>(t.target.id===e||isAncestor(e,t.target.id))&&!isAncestor(e,t.source.id),s=e.isOutgoing=e=>t=>(t.source.id===e||isAncestor(e,t.source.id))&&!isAncestor(e,t.target.id);e.isAnyInOut=e=>{let t=r(e),c=s(e);return e=>t(e)||c(e)}})(Da||={});const Oa=Symbol.for(`nodejs.util.inspect.custom`);var ka=class DeploymentConnectionModel{source;target;relations;id;constructor(e,t,r){this.source=e,this.target=t,this.relations=r,this.id=stringHash$1(`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}[Oa](e,t,r){let s=this.toString();return Object.defineProperty(s,"constructor",{value:DeploymentConnectionModel,enumerable:!1}),s}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(`
39
- `)}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(e){return Array.isArray(e)?e.reduce((e,t)=>e.mergeWith(t),this):(invariant(this.source.id===e.source.id,`Cannot merge connections with different sources`),invariant(this.target.id===e.target.id,`Cannot merge connections with different targets`),new DeploymentConnectionModel(this.source,this.target,this.relations.union(e.relations)))}difference(e){return new DeploymentConnectionModel(this.source,this.target,this.relations.difference(e.relations))}intersect(e){return new DeploymentConnectionModel(this.source,this.target,this.relations.intersect(e.relations))}equals(e){return invariant(e instanceof DeploymentConnectionModel,`Other should ne DeploymentConnectionModel`),this.id===e.id&&this.source.id===e.source.id&&this.target.id===e.target.id&&equals(this.relations.model,e.relations.model)&&equals(this.relations.deployment,e.relations.deployment)}update(e){return e&&={model:this.relations.model,deployment:this.relations.deployment,...e},new DeploymentConnectionModel(this.source,this.target,e?new wa(e.model??new Set,e.deployment??new Set):this.relations)}};function isNestedConnection(e,t){if(!t){let t=e;return e=>isNestedConnection(e,t)}let r=e.source===t.source,s=e.target===t.target;if(r&&s)return!1;let c=isAncestor(t.source.id,e.source.id),u=isAncestor(t.target.id,e.target.id);return c&&u||r&&u||s&&c}function findDeepestNestedConnection(e,t){let r=t;for(let t of e)isNestedConnection(t,r)&&(r=t);return r===t?null:r}function boundaryHierarchy(e){return e.boundary?.id?`.${e.boundary.id}`:``}function sortConnectionsByBoundaryHierarchy(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>_sortByBoundary(e,t)}return _sortByBoundary(e,t??`asc`)}function _sortByBoundary(e,t){return N(e,D(e=>({id:boundaryHierarchy(e),conn:e})),sortNaturalByFqn(t),D(e=>e.conn))}function findAscendingConnections(e,t){return e.filter(e=>isNestedConnection(t,e))}function findDescendantConnections(e,t){return e.filter(isNestedConnection(t))}function mergeConnections(e){let t=new Map;for(let r of e){let e=t.get(r.id);e?t.set(r.id,r.mergeWith(e)):t.set(r.id,r)}return[...t.values()]}function differenceConnections(e,t){let r=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let s=r.get(t.id);if(!s)return e.push(t),e;let c=t.difference(s);return c.nonEmpty()&&e.push(c),e},[])}function hasSameSourceTarget(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function isOutgoing(e,t){if(!t){let t=e;return e=>isOutgoing(e,t)}let r=e;return isDescendantOf(r.source,t)&&!isDescendantOf(r.target,t)}function isIncoming(e,t){if(!t){let t=e;return e=>isIncoming(e,t)}let r=e;return isDescendantOf(r.target,t)&&!isDescendantOf(r.source,t)}function isAnyInOut(e,t){if(!t){let t=e;return e=>isAnyInOut(e,t)}let r=e;return isDescendantOf(r.source,t)!==isDescendantOf(r.target,t)}var Aa=class ConnectionModel{source;target;relations;id;constructor(e,t,r=new Set){this.source=e,this.target=t,this.relations=r,this.id=stringHash$1(`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()&&isome(this.relations,qe(hasSameSourceTarget(this)))}get directRelations(){return new Set(ifilter(this.relations,hasSameSourceTarget(this)))}nonEmpty(){return this.relations.size>0}mergeWith(e){return invariant(this.source.id===e.source.id,`Cannot merge connections with different sources`),invariant(this.target.id===e.target.id,`Cannot merge connections with different targets`),new ConnectionModel(this.source,this.target,union(this.relations,e.relations))}difference(e){return new ConnectionModel(this.source,this.target,difference(this.relations,e.relations))}intersect(e){return invariant(e instanceof ConnectionModel,`Cannot intersect connection with different type`),new ConnectionModel(this.source,this.target,intersection(this.relations,e.relations))}equals(e){invariant(e instanceof ConnectionModel,`Cannot merge connection with different type`);let t=e;return this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&equals(this.relations,t.relations)}update(e){return new ConnectionModel(this.source,this.target,e)}[Oa](e,t,r){let s=this.toString();return Object.defineProperty(s,"constructor",{value:ConnectionModel,enumerable:!1}),s}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
40
- `)}reversed(){return new ConnectionModel(this.target,this.source)}},ja=r({findConnection:()=>findConnection$4,findConnectionsBetween:()=>findConnectionsBetween$4,findConnectionsWithin:()=>findConnectionsWithin$3});function findConnection$4(e,t,r=`directed`){if(e===t||isSameHierarchy(e,t))return[];let s=e.allOutgoing.intersect(t.allIncoming),c=s.nonEmpty?[new ka(e,t,s)]:[];return r===`directed`?c:[...c,...findConnection$4(t,e,`directed`)]}t(findConnection$4,`findConnection`);function findConnectionsBetween$4(e,t,r=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let s=[],c=[];for(let u of t)if(e!==u)for(let t of findConnection$4(e,u,r))t.source===e?s.push(t):c.push(t);return[...s,...c]}t(findConnectionsBetween$4,`findConnectionsBetween`);function findConnectionsWithin$3(e){return[...e].reduce((e,t,r,s)=>(r===s.length-1||e.push(...findConnectionsBetween$4(t,s.slice(r+1),`both`)),e),[])}t(findConnectionsWithin$3,`findConnectionsWithin`);var Ma=r({findConnection:()=>findConnection$3,findConnectionsBetween:()=>findConnectionsBetween$3,findConnectionsWithin:()=>findConnectionsWithin$2});function findConnection$3(e,t,r=`directed`){if(e===t||isSameHierarchy(e,t))return[];let s=intersection(e.allOutgoing,t.allIncoming),c=s.size>0?new Aa(e,t,s):null;if(r===`directed`)return c?[c]:[];let u=intersection(e.allIncoming,t.allOutgoing),d=u.size>0?new Aa(t,e,u):null;return c&&d?[c,d]:c?[c]:d?[d]:[]}t(findConnection$3,`findConnection`);function findConnectionsBetween$3(e,t,r=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let s=[],c=[];for(let u of t)if(e!==u)for(let t of findConnection$3(e,u,r))t.source===e?s.push(t):c.push(t);return[...s,...c]}t(findConnectionsBetween$3,`findConnectionsBetween`);function findConnectionsWithin$2(e){return[...e].reduce((e,t,r,s)=>(r===s.length-1||e.push(...findConnectionsBetween$3(t,s.slice(r+1),`both`)),e),[])}t(findConnectionsWithin$2,`findConnectionsWithin`);function isDeploymentNodeModel(e){return e instanceof DeploymentNodeModel}function isDeployedInstanceModel(e){return e instanceof DeployedInstanceModel}function isDeploymentElementModel(e){return isDeploymentNodeModel(e)||isDeployedInstanceModel(e)}function isNestedElementOfDeployedInstanceModel(e){return e instanceof NestedElementOfDeployedInstanceModel}function isElementModel(e){return e instanceof ElementModel}var Na=e(zt(),1);const Pa=la.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,di.availableParallelism()-2)}get dotpath(){return this._dotpath??memoizeProp(this,`_dotpath`,()=>{let e=Na.default.sync(`dot`);return Pa.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??memoizeProp(this,`_unflattenpath`,()=>{let e=Na.default.sync(`unflatten`);return Pa.debug`Found ${e}`,e})}async unflatten(e){let t,r=Pa.getChild([`unflatten`,De(4)]);try{let s=await Rt(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=s.stdout,j(s.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):r.warn(`{command} has stderr:
41
- `+s.stderr,{command:s.command})}catch(s){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(s)),s instanceof Lt&&!j(s.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
42
- {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),t=s.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=Pa.getChild([`layoutJson`,De(4)]),r;try{let s=await Rt(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=s.stdout,j(s.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):t.warn(`{command} has stderr:
43
- `+s.stderr,{command:s.command})}catch(s){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(s)),s instanceof Lt&&!j(s.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
44
- {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),r=s.stdout;else throw s}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=Pa.getChild([`svg`,De(4)]),r;try{let s=await Rt(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=s.stdout,j(s.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):t.warn(`{command} has stderr:
45
- `+s.stderr,{command:s.command})}catch(s){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(s)),s instanceof Lt&&!j(s.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
46
- {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),r=s.stdout;else throw s}return r}};const Y=la.getChild(`server`);function logWarnError(e){Y.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let s=r.category.join(`.`);if(s===`likec4.config`)break;let c=errorFromLogRecord(r);c?e.telemetry.logEvent({eventName:`error`,message:`${c.name}: ${c.message}`,category:s,...c.stack&&{stack:c.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:s});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:s=hi?`debug`:`warning`,nonBlocking:c=!1,colors:u=!1}={}){let d=!!e&&t&&!hi;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink({formatter:getTextFormatter()}):getConsoleSink({formatter:u?getAnsiColorFormatter():getTextFormatter(),nonBlocking:c}),...d&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...d?[`telemetry`]:[]],lowestLevel:s}]}),Y.trace(`logger configured`)}var Fa=e(ar(),1);const Ia=/^@[A-Za-z0-9_-]*$/,La=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,Ra=z.string().min(1,`Image alias key cannot be empty`).regex(Ia,`Image alias key must match /^@\\w+$/`),za=z.string().min(1,`Image alias value cannot be empty`).regex(La,`Image alias value must be a relative path (no leading slash or protocol)`),Ba=z.record(Ra,za).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).`}),Va=z.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)`),Ha=z.strictObject({paths:z.array(Va).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(`
47
- `)}),maxDepth:z.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(`
48
- `)}),fileThreshold:z.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(`
36
+ `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new Pa,Fa.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,Fa.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return Fa.getChild([e,`_`,Me(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
37
+ `+e),r}try{return JSON.parse(r)}catch(s){throw t.error(loggable(s)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,s}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:s}=e,c=parseGraphvizJson(await this.dotToJson(r),s);return isDynamicView$1(c)&&Object.assign(c,{sequenceLayout:calcSequenceLayout(c)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:c}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let s=this.newScopedLogger(`ai-layout`);try{s.trace`layouting view ${e.id} using AI hints...`;let c=new AiLayoutViewPrinter(e,t,r).print(),u=parseGraphvizJson(await this.dotToJson(c),e);return isDynamicView$1(u)&&Object.assign(u,{sequenceLayout:calcSequenceLayout(u)}),c=normalizeDot(c),s.trace`layouting view ${e.id} done`,{dot:c,diagram:u}}catch(t){throw s.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!isElementView$1(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new Ma(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let s=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(s,e)}};const Ia=xa.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Rt({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=Ia.getChild([`run`,Me(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await promiseNextTick(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),Ia.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,Ia.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){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=Ia.getChild([`batch`,Me(3)]);if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),await promiseNextTick(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));let r=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${r}`,this.isProcessingBatch=!0;let s=[];try{for(let c of e.batch)if(t.trace`add task for view ${c.view.id}`,this.queue.add(async()=>(r<=2&&await promiseNextTick(),await super.layout(c))).then(t=>{if(!t){e.onError?.(c,Error(`Layout queue returned null for view ${c.view.id}`));return}s.push(t),e.onSuccess?.(c,t)}).catch(r=>{t.error(`Fail layout view ${c.view.id}`,{err:r}),e.onError?.(c,r)}),await this.waitForQueueToShrink(r,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}let c=this.queue.pending+this.queue.size;c>0&&(t.trace`waiting ${c} tasks to finish`,await this.queue.onIdle())}finally{t.debug`batch layout done`,this.isProcessingBatch=!1}return s}async waitForQueueToShrink(e=this.queue.concurrency,t=Ia){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},ElementModel=class{$model;$element;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[r,s]=splitGlobalFqn(this.id);r?(this.imported={from:r,fqn:s},this.hierarchyLevel=hierarchyLevel(s)):(this.imported=null,this.hierarchyLevel=hierarchyLevel(this.id))}get name(){return nameFromFqn(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 memoizeProp(this,Symbol.for(`tags`),()=>pe([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get metadata(){return this.$element.metadata??{}}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!ne(this.$element.summary,this.$element.description)}get summary(){return ca.memoize(this,`summary`,preferSummary(this.$element))}get description(){return ca.memoize(this,`description`,preferDescription(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return memoizeProp(this,Symbol.for(`defaultView`),()=>ihead(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return memoizeProp(this,`style`,()=>exact({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 isAncestor(this,e)}isDescendantOf(e){return isAncestor(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=commonAncestor(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?sortNaturalByFqn([...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 r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.target)}get allOutgoing(){return memoizeProp(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return memoizeProp(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 memoizeProp(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 x(ihead(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!E(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},AbstractDeploymentElementModel=class{Aux;get style(){return memoizeProp(this,`style`,()=>exact({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 nameFromFqn(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return ca.memoize(this,`summary`,preferSummary(this.$node))}get description(){return ca.memoize(this,`description`,preferDescription(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=commonAncestor(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 r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.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 memoizeProp(this,Symbol.for(`allOutgoing`),()=>La.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>La.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!E(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},DeploymentNodeModel=class extends AbstractDeploymentElementModel{$model;$node;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=hierarchyLevel(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get metadata(){return this.$node.metadata??{}}get tags(){return memoizeProp(this,Symbol.for(`tags`),()=>pe([...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=ihead(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 r of this.instances()){for(let t of r.element.outgoing())e.add(t);for(let e of r.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 intersection(t,e)}},DeployedInstanceModel=class extends AbstractDeploymentElementModel{$model;$instance;element;id;_literalId;title;hierarchyLevel;constructor(e,t,r){super(),this.$model=e,this.$instance=t,this.element=r,this.id=t.id,this._literalId=t.id,this.title=t.title??r.title,this.hierarchyLevel=hierarchyLevel(t.id)}get $node(){return this.$instance}get parent(){return nonNullable(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return memoizeProp(this,`style`,()=>exact({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 memoizeProp(this,Symbol.for(`tags`),()=>pe([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return ca.memoize(this,`summary`,preferSummary(this.$instance)??preferSummary(this.element.$element))}get description(){return ca.memoize(this,`description`,preferDescription(this.$instance)??preferDescription(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)}}},NestedElementOfDeployedInstanceModel=class{instance;element;constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return memoizeProp(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}},DeploymentRelationModel=class{$model;$relationship;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 r=commonAncestor(this.source.id,this.target.id);this.boundary=r?this.$model.node(r):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return x(this.$relationship.title)?this.$relationship.title:null}get technology(){return se(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&&!ne(this.$relationship.summary,this.$relationship.description)}get summary(){return ca.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return ca.memoize(this,`description`,preferDescription(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}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&&!E(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},La=class RelationshipsAccum{model;deployment;static empty(){return new RelationshipsAccum}static from(e,t){return new RelationshipsAccum(new Set(e),new Set(t))}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(e){return RelationshipsAccum.from(intersection(this.model,e.model),intersection(this.deployment,e.deployment))}difference(e){return RelationshipsAccum.from(difference(this.model,e.model),difference(this.deployment,e.deployment))}union(e){return RelationshipsAccum.from(union(this.model,e.model),union(this.deployment,e.deployment))}};const getId=e=>typeof e==`string`?e:e.id,splitViewTitle=e=>{if(invariant(!e.includes(`
38
+ `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return j(t,1)?t:[``]}return[e.trim()]},normalizeViewPath=e=>splitViewTitle(e).join(`/`),getViewFolderPath=e=>{let t=splitViewTitle(e);return j(t,2)?t.slice(0,-1).join(`/`):null},extractViewTitleFromPath=e=>e.includes(`/`)?splitViewTitle(e).at(-1)??e:e.trim();var LikeC4DeploymentModel=class{$model;#e=new Map;#t=new Map;#n=new P.default(()=>new Set);#r=new P.default(()=>new Set);#i=new Set;#a=new Map;#o=new P.default(()=>new Set);#s=new P.default(()=>new Set);#c=new P.default(()=>new Set);#l=new P.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,r=Be(t.elements);for(let e of sortParentsFirst(r)){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 Be(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 DeploymentNodeModel||e instanceof DeployedInstanceModel)return e;let t=getId(e);return nonNullable(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return invariant(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(invariant(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return invariant(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(invariant(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=getId(e),r=this.#r.get(t);r&&(yield*r)}deploymentRef(e){if(G.isInsideInstanceRef(e)){let{deployment:t,element:r}=e;return getOrCreate(this.#u,`${t}@${r}`,()=>new NestedElementOfDeployedInstanceModel(this.instance(t),this.$model.element(r)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=getId(e);return nonNullable(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=getId(e);return this.#t.get(t)||null}children(e){let t=getId(e);return this.#n.get(t)}*siblings(e){let t=getId(e),r=this.parent(e)?.children()??this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),r;for(;r=this.#t.get(t);)yield r,t=r.id}*descendants(e,t=`desc`){for(let r of this.children(e))t===`asc`?(yield r,yield*this.descendants(r.id)):(yield*this.descendants(r.id),yield r)}*incoming(e,t=`all`){let r=getId(e);for(let e of this.#o.get(r))switch(!0){case t===`all`:case t===`direct`&&e.target.id===r:case t===`to-descendants`&&e.target.id!==r:yield e;break}}*outgoing(e,t=`all`){let r=getId(e);for(let e of this.#s.get(r))switch(!0){case t===`all`:case t===`direct`&&e.source.id===r:case t===`from-descendants`&&e.source.id!==r:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=isDeploymentNode$1(e)?new DeploymentNodeModel(this,Object.freeze(e)):new DeployedInstanceModel(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let r=parentFqn(t.id);return r?(invariant(this.#e.has(r),`Parent ${r} of ${t.id} not found`),this.#t.set(t.id,this.node(r)),this.#n.get(r).add(t)):(invariant(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 DeploymentRelationModel(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 r=t.boundary?.id??null;if(r)for(let e of[r,...ancestorsFqn(r)])this.#c.get(e).add(t);for(let e of ancestorsFqn(t.source.id)){if(e===r)break;this.#s.get(e).add(t)}for(let e of ancestorsFqn(t.target.id)){if(e===r)break;this.#o.get(e).add(t)}return t}},RelationshipModel=class{model;$relationship;source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(G.flatten(t.source)),this.target=e.element(G.flatten(t.target));let r=commonAncestor(this.source.id,this.target.id);this.boundary=r?this.model.element(r):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return se(this.$relationship.title)?null:this.$relationship.title}get technology(){return se(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&&!ne(this.$relationship.summary,this.$relationship.description)}get summary(){return ca.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return ca.memoize(this,`description`,preferDescription(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 metadata(){return this.$relationship.metadata??{}}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&&!E(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},EdgeModel=class{source;target;Aux;$viewModel;$view;$edge;constructor(e,t,r,s){this.source=r,this.target=s,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 ca.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 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 isStepPath(this.$edge.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let r=this.$viewModel.$model.findRelationship(t,e);r&&(yield r)}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)}},NodeModel=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 ca.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return ca.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 memoizeProp(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 r=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&r.target.id===this.id:case e===`to-descendants`&&r.target.id!==this.id:yield r;break}}}*incomers(e=`all`){let t=new Set;for(let r of this.incoming(e))t.has(r.source.id)||(t.add(r.source.id),yield r.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let r=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&r.source.id===this.id:case e===`from-descendants`&&r.source.id!==this.id:yield r;break}}}*outgoers(e=`all`){let t=new Set;for(let r of this.outgoing(e))t.has(r.target.id)||(t.add(r.target.id),yield r.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 x(this.$node.modelRef)}hasDeployment(){return x(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return isGroupElementKind(this.$node)}isTagged(e){return this.tags.includes(e)}},LikeC4ViewModel=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new P.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,r,s){this.$model=e,this.#e=r,this.id=r.id,this.folder=t,this.#c=s;for(let e of this.#e.nodes){let t=new NodeModel(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 EdgeModel(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=r.title?extractViewTitleFromPath(r.title):null,this.viewPath=r.title?normalizeViewPath(r.title):r.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Gi]}get stage(){return this.#e[Wi]}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 memoizeProp(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return ca.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?memoizeProp(this,`withDriftReasons`,()=>calcDriftsFromSnapshot(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?this.#e._layout===`manual`?this.#e:memoizeProp(this,`snapshotWithManualLayout`,()=>applyManualLayout(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=getId(e);return nonNullable(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(getId(e))??null}findNodeWithElement(e){let t=getId(e);return this.#i.has(t)?ifind(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=getId(e);return nonNullable(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(getId(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(getId(e))}includesDeployment(e){return this.#a.has(getId(e))}includesRelation(e){return this.#o.has(getId(e))}isComputed(){return this.#e[Wi]===`computed`}isLayouted(){return this.#e[Wi]===`layouted`}isDiagram(){return this.#e[Wi]===`layouted`}isElementView(){return this.#e[Gi]===`element`}isScopedElementView(){return this.#e._type===`element`&&x(this.#e.viewOf)}isDeploymentView(){return this.#e[Gi]===`deployment`}isDynamicView(){return this.#e[Gi]===`dynamic`}},Ra=class LikeC4ViewsFolder{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,r){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=ke(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=r}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return invariant(!this.isRoot,`Root view folder has no breadcrumbs`),memoizeProp(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return invariant(!this.isRoot,`Root view folder has no parent`),se(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return memoizeProp(this,`folders`,()=>{let e=[];for(let t of this.children)t instanceof LikeC4ViewsFolder&&e.push(t);return e})}get views(){return memoizeProp(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof LikeC4ViewModel&&e.push(t);return e})}},za=class LikeC4Model{Aux;_elements=new Map;_parents=new Map;_children=new P.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new P.default(()=>new Set);_outgoing=new P.default(()=>new Set);_internal=new P.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new P.default(()=>new Set);_allTags=new P.default(()=>new Set);static fromParsed(e){return new LikeC4Model(e)}static create(e){return new LikeC4Model(e)}static fromDump(e){let{_stage:t=`layouted`,projectId:r=`unknown`,project:s,globals:c,imports:u,deployments:d,views:p,relations:m,elements:h,specification:g}=e;return new LikeC4Model({[Wi]:t,projectId:r,project:s,globals:{predicates:c?.predicates??{},dynamicPredicates:c?.dynamicPredicates??{},styles:c?.styles??{}},imports:u??{},deployments:{elements:d?.elements??{},relations:d?.relations??{}},views:p??{},relations:m??{},elements:h??{},specification:g})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of be(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,r]of be(e.imports??{}))for(let e of sortParentsFirst(r)){let r=this.addImportedElement(t,e);for(let e of r.tags)this._allTags.get(e).add(r)}for(let t of Be(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new LikeC4DeploymentModel(this),isOnStage(e,`computed`)||isOnStage(e,`layouted`)){let t=compareNaturalHierarchically(`/`),r=k(Be(e.views),w(e=>({view:e,path:normalizeViewPath(e.title??e.id),folderPath:e.title&&getViewFolderPath(e.title)||``})),ye((e,r)=>t(e.folderPath,r.folderPath))),getOrCreateFolder=e=>{let t=this._viewFolders.get(e);if(!t){let s=Ae(e,`/`);invariant(j(s,1),`View group path "${e}" must have at least one element`);let c;c=e===``?r.find(e=>e.view.id===`index`):r.find(t=>t.path===e),t=new Ra(this,s,c?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=getOrCreateFolder(``);for(let{folderPath:e}of r)this._viewFolders.has(e)||Ae(e,`/`).reduce((e,t)=>{let r=e.join(`/`),s=E(r)?t:r+`/`+t,c=getOrCreateFolder(s);return this._viewFolderItems.get(r).add(c),e.push(t),e},[]);for(let{view:t,folderPath:s}of r){let r=new LikeC4ViewModel(this,getOrCreateFolder(s),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(s).add(r),this._views.set(t.id,r);for(let e of r.tags)this._allTags.get(e).add(r)}}else this._rootViewFolder=new Ra(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 memoizeProp(this,`styles`,()=>ea.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[Wi]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??memoizeProp(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return memoizeProp(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof ElementModel)return e;let t=getId(e);return nonNullable(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(getId(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 r=getId(e),s=this._relations.get(r)??null;return s||t===`model`?nonNullable(s,`Model relation ${r} not found`):nonNullable(this.deployment.findRelationship(r),`No model/deployment relation ${r} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let r=this._relations.get(getId(e))??null;return r||t===`model`?r:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=getId(e);return nonNullable(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 nonNullable(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return invariant(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=getId(e);return this._parents.get(t)||null}children(e){let t=getId(e);return this._children.get(t)}*siblings(e){let t=getId(e),r=this._parents.get(t),s=r?this._children.get(r.id).values():this.roots();for(let e of s)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),r;for(;r=this._parents.get(t);)yield r,t=r.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let r=getId(e);for(let e of this._incoming.get(r))switch(!0){case t===`all`:case t===`direct`&&e.target.id===r:case t===`to-descendants`&&e.target.id!==r:yield e;break}}*outgoing(e,t=`all`){let r=getId(e);for(let e of this._outgoing.get(r))switch(!0){case t===`all`:case t===`direct`&&e.source.id===r:case t===`from-descendants`&&e.source.id!==r:yield e;break}}get tags(){return memoizeProp(this,`tags`,()=>ye([...this._allTags.keys()],compareNatural))}get tagsSortedByUsage(){return memoizeProp(this,`tagsSortedByUsage`,()=>k([...this._allTags.entries()],w(([e,t])=>({tag:e,count:t.size,tagged:t})),ye((e,t)=>compareNatural(e.tag,t.tag)),Ke([D(`count`),`desc`])))}findByTag(e,t){return ifilter(this._allTags.get(e),e=>t===`elements`?e instanceof ElementModel:t===`views`?e instanceof LikeC4ViewModel:t!==`relationships`||e instanceof RelationshipModel)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=whereOperatorAsPredicate(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=whereOperatorAsPredicate(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 ElementModel(this,Object.freeze(e));this._elements.set(t.id,t);let r=parentFqn(t.id);return r?(invariant(this._elements.has(r),`Parent ${r} of ${t.id} not found`),this._parents.set(t.id,this.element(r)),this._children.get(r).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){invariant(!isGlobalFqn(t.id),`Imported element already has global FQN`);let r=GlobalFqn(e,t.id);if(this._elements.has(r))throw Error(`Element ${r} already exists`);let s=new ElementModel(this,Object.freeze({...t,id:r}));this._elements.set(s.id,s);let c=parentFqn(s.id);for(;c;){if(c.includes(`.`)&&this._elements.has(c))return this._parents.set(s.id,this.element(c)),this._children.get(c).add(s),s;c=parentFqn(c)}return this._rootElements.add(s),s}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new RelationshipModel(this,Object.freeze(e)),{source:r,target:s}=t;this._relations.set(t.id,t),this._incoming.get(s.id).add(t),this._outgoing.get(r.id).add(t);let c=commonAncestor(r.id,s.id);if(c)for(let e of[c,...ancestorsFqn(c)])this._internal.get(e).add(t);for(let e of ancestorsFqn(r.id)){if(e===c)break;this._outgoing.get(e).add(t)}for(let e of ancestorsFqn(s.id)){if(e===c)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=za.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(za||={});let Ba;(function(e){e.isInside=e=>t=>isAncestor(e,t.source.id)&&isAncestor(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>r=>(r.source.id===e||isAncestor(e,r.source.id))&&(r.target.id===t||isAncestor(t,r.target.id));e.isAnyBetween=(e,r)=>{let s=t(e,r),c=t(r,e);return e=>s(e)||c(e)};let r=e.isIncoming=e=>t=>(t.target.id===e||isAncestor(e,t.target.id))&&!isAncestor(e,t.source.id),s=e.isOutgoing=e=>t=>(t.source.id===e||isAncestor(e,t.source.id))&&!isAncestor(e,t.target.id);e.isAnyInOut=e=>{let t=r(e),c=s(e);return e=>t(e)||c(e)}})(Ba||={});const Va=Symbol.for(`nodejs.util.inspect.custom`);var Ha=class DeploymentConnectionModel{source;target;relations;id;constructor(e,t,r){this.source=e,this.target=t,this.relations=r,this.id=stringHash$1(`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}[Va](e,t,r){let s=this.toString();return Object.defineProperty(s,"constructor",{value:DeploymentConnectionModel,enumerable:!1}),s}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(`
39
+ `)}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(e){return Array.isArray(e)?e.reduce((e,t)=>e.mergeWith(t),this):(invariant(this.source.id===e.source.id,`Cannot merge connections with different sources`),invariant(this.target.id===e.target.id,`Cannot merge connections with different targets`),new DeploymentConnectionModel(this.source,this.target,this.relations.union(e.relations)))}difference(e){return new DeploymentConnectionModel(this.source,this.target,this.relations.difference(e.relations))}intersect(e){return new DeploymentConnectionModel(this.source,this.target,this.relations.intersect(e.relations))}equals(e){return invariant(e instanceof DeploymentConnectionModel,`Other should ne DeploymentConnectionModel`),this.id===e.id&&this.source.id===e.source.id&&this.target.id===e.target.id&&equals(this.relations.model,e.relations.model)&&equals(this.relations.deployment,e.relations.deployment)}update(e){return e&&={model:this.relations.model,deployment:this.relations.deployment,...e},new DeploymentConnectionModel(this.source,this.target,e?new La(e.model??new Set,e.deployment??new Set):this.relations)}};function isNestedConnection(e,t){if(!t){let t=e;return e=>isNestedConnection(e,t)}let r=e.source===t.source,s=e.target===t.target;if(r&&s)return!1;let c=isAncestor(t.source.id,e.source.id),u=isAncestor(t.target.id,e.target.id);return c&&u||r&&u||s&&c}function findDeepestNestedConnection(e,t){let r=t;for(let t of e)isNestedConnection(t,r)&&(r=t);return r===t?null:r}function boundaryHierarchy(e){return e.boundary?.id?`.${e.boundary.id}`:``}function sortConnectionsByBoundaryHierarchy(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>_sortByBoundary(e,t)}return _sortByBoundary(e,t??`asc`)}function _sortByBoundary(e,t){return k(e,w(e=>({id:boundaryHierarchy(e),conn:e})),sortNaturalByFqn(t),w(e=>e.conn))}function findAscendingConnections(e,t){return e.filter(e=>isNestedConnection(t,e))}function findDescendantConnections(e,t){return e.filter(isNestedConnection(t))}function mergeConnections(e){let t=new Map;for(let r of e){let e=t.get(r.id);e?t.set(r.id,r.mergeWith(e)):t.set(r.id,r)}return[...t.values()]}function differenceConnections(e,t){let r=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let s=r.get(t.id);if(!s)return e.push(t),e;let c=t.difference(s);return c.nonEmpty()&&e.push(c),e},[])}function hasSameSourceTarget(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function isOutgoing(e,t){if(!t){let t=e;return e=>isOutgoing(e,t)}let r=e;return isDescendantOf(r.source,t)&&!isDescendantOf(r.target,t)}function isIncoming(e,t){if(!t){let t=e;return e=>isIncoming(e,t)}let r=e;return isDescendantOf(r.target,t)&&!isDescendantOf(r.source,t)}function isAnyInOut(e,t){if(!t){let t=e;return e=>isAnyInOut(e,t)}let r=e;return isDescendantOf(r.source,t)!==isDescendantOf(r.target,t)}var Ua=class ConnectionModel{source;target;relations;id;constructor(e,t,r=new Set){this.source=e,this.target=t,this.relations=r,this.id=stringHash$1(`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()&&isome(this.relations,d(hasSameSourceTarget(this)))}get directRelations(){return new Set(ifilter(this.relations,hasSameSourceTarget(this)))}nonEmpty(){return this.relations.size>0}mergeWith(e){return invariant(this.source.id===e.source.id,`Cannot merge connections with different sources`),invariant(this.target.id===e.target.id,`Cannot merge connections with different targets`),new ConnectionModel(this.source,this.target,union(this.relations,e.relations))}difference(e){return new ConnectionModel(this.source,this.target,difference(this.relations,e.relations))}intersect(e){return invariant(e instanceof ConnectionModel,`Cannot intersect connection with different type`),new ConnectionModel(this.source,this.target,intersection(this.relations,e.relations))}equals(e){invariant(e instanceof ConnectionModel,`Cannot merge connection with different type`);let t=e;return this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&equals(this.relations,t.relations)}update(e){return new ConnectionModel(this.source,this.target,e)}[Va](e,t,r){let s=this.toString();return Object.defineProperty(s,"constructor",{value:ConnectionModel,enumerable:!1}),s}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
40
+ `)}reversed(){return new ConnectionModel(this.target,this.source)}},Wa=t({findConnection:()=>findConnection$4,findConnectionsBetween:()=>findConnectionsBetween$4,findConnectionsWithin:()=>findConnectionsWithin$3});function findConnection$4(e,t,r=`directed`){if(e===t||isSameHierarchy(e,t))return[];let s=e.allOutgoing.intersect(t.allIncoming),c=s.nonEmpty?[new Ha(e,t,s)]:[];return r===`directed`?c:[...c,...findConnection$4(t,e,`directed`)]}r(findConnection$4,`findConnection`);function findConnectionsBetween$4(e,t,r=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let s=[],c=[];for(let u of t)if(e!==u)for(let t of findConnection$4(e,u,r))t.source===e?s.push(t):c.push(t);return[...s,...c]}r(findConnectionsBetween$4,`findConnectionsBetween`);function findConnectionsWithin$3(e){return[...e].reduce((e,t,r,s)=>(r===s.length-1||e.push(...findConnectionsBetween$4(t,s.slice(r+1),`both`)),e),[])}r(findConnectionsWithin$3,`findConnectionsWithin`);var Ga=t({findConnection:()=>findConnection$3,findConnectionsBetween:()=>findConnectionsBetween$3,findConnectionsWithin:()=>findConnectionsWithin$2});function findConnection$3(e,t,r=`directed`){if(e===t||isSameHierarchy(e,t))return[];let s=intersection(e.allOutgoing,t.allIncoming),c=s.size>0?new Ua(e,t,s):null;if(r===`directed`)return c?[c]:[];let u=intersection(e.allIncoming,t.allOutgoing),d=u.size>0?new Ua(t,e,u):null;return c&&d?[c,d]:c?[c]:d?[d]:[]}r(findConnection$3,`findConnection`);function findConnectionsBetween$3(e,t,r=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let s=[],c=[];for(let u of t)if(e!==u)for(let t of findConnection$3(e,u,r))t.source===e?s.push(t):c.push(t);return[...s,...c]}r(findConnectionsBetween$3,`findConnectionsBetween`);function findConnectionsWithin$2(e){return[...e].reduce((e,t,r,s)=>(r===s.length-1||e.push(...findConnectionsBetween$3(t,s.slice(r+1),`both`)),e),[])}r(findConnectionsWithin$2,`findConnectionsWithin`);function isDeploymentNodeModel(e){return e instanceof DeploymentNodeModel}function isDeployedInstanceModel(e){return e instanceof DeployedInstanceModel}function isDeploymentElementModel(e){return isDeploymentNodeModel(e)||isDeployedInstanceModel(e)}function isNestedElementOfDeployedInstanceModel(e){return e instanceof NestedElementOfDeployedInstanceModel}function isElementModel(e){return e instanceof ElementModel}const Ka=xa.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,ai.availableParallelism()-2)}get dotpath(){return this._dotpath??memoizeProp(this,`_dotpath`,()=>{let e=oi.sync(`dot`);return Ka.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??memoizeProp(this,`_unflattenpath`,()=>{let e=oi.sync(`unflatten`);return Ka.debug`Found ${e}`,e})}async unflatten(e){let t,r=Ka.getChild([`unflatten`,Me(4)]);try{let s=await Bt(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=s.stdout,E(s.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):r.warn(`{command} has stderr:
41
+ `+s.stderr,{command:s.command})}catch(s){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(s)),s instanceof zt&&!E(s.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
42
+ {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),t=s.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=Ka.getChild([`layoutJson`,Me(4)]),r;try{let s=await Bt(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=s.stdout,E(s.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):t.warn(`{command} has stderr:
43
+ `+s.stderr,{command:s.command})}catch(s){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(s)),s instanceof zt&&!E(s.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
44
+ {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),r=s.stdout;else throw s}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=Ka.getChild([`svg`,Me(4)]),r;try{let s=await Bt(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=s.stdout,E(s.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:s.command,durationMs:Math.round(s.durationMs)}):t.warn(`{command} has stderr:
45
+ `+s.stderr,{command:s.command})}catch(s){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(s)),s instanceof zt&&!E(s.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
46
+ {stderr}`,{command:s.command,exitCode:s.exitCode,stderr:s.stderr}),r=s.stdout;else throw s}return r}};const Y=xa.getChild(`server`);function logWarnError(e){Y.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let s=r.category.join(`.`);if(s===`likec4.config`)break;let c=errorFromLogRecord(r);c?e.telemetry.logEvent({eventName:`error`,message:`${c.name}: ${c.message}`,category:s,...c.stack&&{stack:c.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:s});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:s=pi?`debug`:`warning`,nonBlocking:c=!1,colors:u=!1}={}){let d=!!e&&t&&!pi;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink({formatter:getTextFormatter()}):getConsoleSink({formatter:u?getAnsiColorFormatter():getTextFormatter(),nonBlocking:c}),...d&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...d?[`telemetry`]:[]],lowestLevel:s}]}),Y.trace(`logger configured`)}const qa=/^@[A-Za-z0-9_-]*$/,Ja=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,Ya=I.string().min(1,`Image alias key cannot be empty`).regex(qa,`Image alias key must match /^@\\w+$/`),Xa=I.string().min(1,`Image alias value cannot be empty`).regex(Ja,`Image alias value must be a relative path (no leading slash or protocol)`),Za=I.record(Ya,Xa).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).`}),Qa=I.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)`),$a=I.strictObject({paths:I.array(Qa).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(`
47
+ `)}),maxDepth:I.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(`
48
+ `)}),fileThreshold:I.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(`
49
49
  `)})}).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(`
50
- `)}),Ua=z.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%`}),Wa=z.enum(Mi).meta({id:`ElementShape`}),Ga=z.enum(ji).meta({id:`BorderStyle`}),Ka=z.enum(ki).meta({id:`ElementSize`}),qa=z.enum(Ai).meta({id:`IconPosition`}),Ja=z.enum(aa).meta({id:`ArrowType`}),Ya=z.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),Xa=z.enum(Ni).meta({id:`ThemeColorName`}),Za=z.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),Qa=Xa.or(Za).transform(e=>e).meta({id:`ColorName`}),$a=z.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),eo=z.strictObject({fill:$a.meta({description:`Background color`}),stroke:$a.meta({description:`Stroke color (border, paths above background)`}),hiContrast:$a.meta({description:`High contrast text color (title)`}),loContrast:$a.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),to=z.strictObject({line:$a.meta({description:`Line color`}),label:$a.meta({description:`Label text color`}),labelBg:$a.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),no=z.strictObject({elements:eo.or($a.transform(e=>computeColorValues(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:to.or($a.transform(e=>computeColorValues(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($a.transform(e=>computeColorValues(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),ro=z.partialRecord(Qa,no).transform(e=>e),io=z.strictObject({width:z.number().min(50),height:z.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),ao=z.partialRecord(Ka,io),oo=z.strictObject({colors:ro.optional().meta({description:`Override theme colors`}),sizes:ao.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>exact({colors:e?exact(e):void 0,sizes:t?exact(t):void 0})),so=z.strictObject({color:Qa.optional().meta({description:`Default color for groups
51
- (must be a valid color name from the theme)`}),opacity:Ua.optional().meta({description:`Default opacity for groups`}),border:Ga.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),co=z.strictObject({color:Qa.optional().meta({description:`Default color for relationships
52
- (must be a valid color name from the theme)`}),line:Ya.optional().meta({description:`Default line style for relationships`}),arrow:Ja.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
53
- These values will be used if such property is not defined`}),lo=z.strictObject({color:Qa.optional().meta({description:`Default color for elements
54
- (must be a valid color name from the theme)`}),opacity:Ua.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:Ga.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:Ka.optional().meta({description:`Default size for elements`}),shape:Wa.optional().meta({description:`Default shape for elements`}),iconPosition:qa.optional().meta({description:`Default icon position for elements`}),group:so.optional().meta({description:`Override default values for group style properties
55
- These values will be used if such property is not defined`}),relationship:co.optional().meta({description:`Override default values for relationship style properties
56
- These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),uo=z.union([z.string().min(1,`Custom CSS file path cannot be empty`),z.array(z.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),fo=z.strictObject({theme:oo.optional().meta({description:`Project theme customization`}),defaults:lo.optional().meta({description:`Override default values for style properties
57
- These values will be used if such property is not defined`}),customCss:uo.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:r})=>exact({defaults:normalizeDefaults(t),customCss:normalizeStylesheets(r),theme:e}));function normalizeDefaults(e){if(!e)return;let{relationship:t,group:r,...s}=e;return exact({...s,relationship:t&&exact(t),group:r&&exact(r)})}function normalizeStylesheets(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const po=z.strictObject({outDir:z.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(`
58
- `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),mo=z.union([z.strictObject({redirect:z.literal(!0)}),z.strictObject({include:z.array(z.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`include list cannot be empty`)}),z.strictObject({exclude:z.array(z.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`exclude list cannot be empty`)})]).meta({id:`LandingPageConfig`,description:`Configure the landing page. Use redirect to go to the index view, or include/exclude to filter the view grid.`}),ho=z.object({name:z.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:z.union([z.string().min(1,`Extend path cannot be empty`),z.array(z.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:z.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:z.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:z.record(z.string(),z.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:fo.optional().meta({description:`Project styles customization`}),imageAliases:Ba.optional(),include:Ha.optional(),exclude:z.array(z.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:po.optional(),inferTechnologyFromIcon:z.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(`
59
- `)}),implicitViews:z.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`}),landingPage:mo.optional()}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),go=z.instanceof(Function),_o=z.record(z.string(),go);ho.extend({generators:_o.optional()});function validateProjectConfig(e){let t=e.landingPage,r=null;if(t!=null){let e=mo.safeParse(t);if(!e.success)throw Error(`Config validation failed:
60
- `+z.prettifyError(e.error));r=e.data}let s=ho.safeParse(e);if(!s.success)throw Error(`Config validation failed:
61
- `+z.prettifyError(s.error));let c=s.data;r!==null&&(c={...c,landingPage:r});let u=e.generators;if(typeof u==`object`&&u&&!Array.isArray(u)){let e=_o.safeParse(u);if(!e.success)throw Error(`Config validation failed (generators):
62
- `+z.prettifyError(e.error));return{...c,generators:e.data}}return c}function parseProjectConfigJSON(e){return validateProjectConfig(Fa.default.parse(e.trim()||`{}`))}const vo={parse:parseProjectConfigJSON,validate:validateProjectConfig,normalizeInclude:e=>{let t=Ha.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function trimTrailingSlashes(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function splitPath(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function basename$1(e){let t=trimTrailingSlashes(e),r=splitPath(t);return r[r.length-1]||t}t(basename$1,`basename`);const yo=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],bo=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...yo,...bo];function isLikeC4JsonConfig(e){return yo.includes(basename$1(e))}function isLikeC4NonJsonConfig(e){return bo.includes(basename$1(e))}function isLikeC4Config(e){return isLikeC4JsonConfig(e)||isLikeC4NonJsonConfig(e)}const xo=ho.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await ci.readFile(e,`utf-8`),r;try{r=Fa.default.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let s=xo.safeParse(r);if(!s.success)throw Error(`${e}: Invalid config\n`+z.prettifyError(s.error));return s.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let r=t.indexOf(e),s=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${s}`)}let r=await parseJsonConfig(e),s=normalizeExtends(r.extends),c=[...t,e],u=[];for(let t of s){let r=ai(ri(e),t);u.push(...await loadJsonConfigs(r,c))}return[...u,r]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,la.getChild(`config`).debug`Loading config: ${ii(oi(),e)}`;let t=ri(e),r=ni(e),s={name:ni(t)};if(isLikeC4JsonConfig(r)){let t=await loadJsonConfigs(ai(e),[]);invariant(P(t,1),`Expect at least one config`);let r=ne(Te(t),[`extends`,`styles`]),c=t.map(e=>e.styles).filter(p),u=c.length>0?Ki({},...c.reverse()):void 0;return validateProjectConfig({...s,...r,...u?{styles:u}:{}})}invariant(isLikeC4NonJsonConfig(r),`Invalid name for config file: ${e}`);let{mod:c}=await gi({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=_i(e.errors,{kind:`error`});for(let e of t)la.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
50
+ `)}),eo=I.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%`}),to=I.enum(Ri).meta({id:`ElementShape`}),no=I.enum(Li).meta({id:`BorderStyle`}),ro=I.enum(Fi).meta({id:`ElementSize`}),io=I.enum(Ii).meta({id:`IconPosition`}),ao=I.enum(_a).meta({id:`ArrowType`}),oo=I.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),so=I.enum(zi).meta({id:`ThemeColorName`}),co=I.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),lo=so.or(co).transform(e=>e).meta({id:`ColorName`}),uo=I.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),fo=I.strictObject({fill:uo.meta({description:`Background color`}),stroke:uo.meta({description:`Stroke color (border, paths above background)`}),hiContrast:uo.meta({description:`High contrast text color (title)`}),loContrast:uo.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),po=I.strictObject({line:uo.meta({description:`Line color`}),label:uo.meta({description:`Label text color`}),labelBg:uo.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),mo=I.strictObject({elements:fo.or(uo.transform(e=>computeColorValues(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:po.or(uo.transform(e=>computeColorValues(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(uo.transform(e=>computeColorValues(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),ho=I.partialRecord(lo,mo).transform(e=>e),go=I.strictObject({width:I.number().min(50),height:I.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),_o=I.partialRecord(ro,go),vo=I.strictObject({colors:ho.optional().meta({description:`Override theme colors`}),sizes:_o.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>exact({colors:e?exact(e):void 0,sizes:t?exact(t):void 0})),yo=I.strictObject({color:lo.optional().meta({description:`Default color for groups
51
+ (must be a valid color name from the theme)`}),opacity:eo.optional().meta({description:`Default opacity for groups`}),border:no.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),bo=I.strictObject({color:lo.optional().meta({description:`Default color for relationships
52
+ (must be a valid color name from the theme)`}),line:oo.optional().meta({description:`Default line style for relationships`}),arrow:ao.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
53
+ These values will be used if such property is not defined`}),xo=I.strictObject({color:lo.optional().meta({description:`Default color for elements
54
+ (must be a valid color name from the theme)`}),opacity:eo.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:no.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:ro.optional().meta({description:`Default size for elements`}),shape:to.optional().meta({description:`Default shape for elements`}),iconPosition:io.optional().meta({description:`Default icon position for elements`}),group:yo.optional().meta({description:`Override default values for group style properties
55
+ These values will be used if such property is not defined`}),relationship:bo.optional().meta({description:`Override default values for relationship style properties
56
+ These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),So=I.union([I.string().min(1,`Custom CSS file path cannot be empty`),I.array(I.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),Co=I.strictObject({theme:vo.optional().meta({description:`Project theme customization`}),defaults:xo.optional().meta({description:`Override default values for style properties
57
+ These values will be used if such property is not defined`}),customCss:So.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:r})=>exact({defaults:normalizeDefaults(t),customCss:normalizeStylesheets(r),theme:e}));function normalizeDefaults(e){if(!e)return;let{relationship:t,group:r,...s}=e;return exact({...s,relationship:t&&exact(t),group:r&&exact(r)})}function normalizeStylesheets(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const wo=I.strictObject({outDir:I.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(`
58
+ `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),To=I.union([I.strictObject({redirect:I.literal(!0)}),I.strictObject({include:I.array(I.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`include list cannot be empty`)}),I.strictObject({exclude:I.array(I.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`exclude list cannot be empty`)})]).meta({id:`LandingPageConfig`,description:`Configure the landing page. Use redirect to go to the index view, or include/exclude to filter the view grid.`}),Eo=I.object({name:I.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:I.union([I.string().min(1,`Extend path cannot be empty`),I.array(I.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:I.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:I.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:I.record(I.string(),I.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:Co.optional().meta({description:`Project styles customization`}),imageAliases:Za.optional(),include:$a.optional(),exclude:I.array(I.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:wo.optional(),inferTechnologyFromIcon:I.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(`
59
+ `)}),implicitViews:I.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`}),landingPage:To.optional()}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),Do=I.instanceof(Function),Oo=I.record(I.string(),Do);Eo.extend({generators:Oo.optional()});function validateProjectConfig(e){let t=e.landingPage,r=null;if(t!=null){let e=To.safeParse(t);if(!e.success)throw Error(`Config validation failed:
60
+ `+I.prettifyError(e.error));r=e.data}let s=Eo.safeParse(e);if(!s.success)throw Error(`Config validation failed:
61
+ `+I.prettifyError(s.error));let c=s.data;r!==null&&(c={...c,landingPage:r});let u=e.generators;if(typeof u==`object`&&u&&!Array.isArray(u)){let e=Oo.safeParse(u);if(!e.success)throw Error(`Config validation failed (generators):
62
+ `+I.prettifyError(e.error));return{...c,generators:e.data}}return c}function parseProjectConfigJSON(e){return validateProjectConfig(mi.parse(e.trim()||`{}`))}const ko={parse:parseProjectConfigJSON,validate:validateProjectConfig,normalizeInclude:e=>{let t=$a.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function trimTrailingSlashes(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function splitPath(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function basename$1(e){let t=trimTrailingSlashes(e),r=splitPath(t);return r[r.length-1]||t}r(basename$1,`basename`);const Ao=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],jo=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...Ao,...jo];function isLikeC4JsonConfig(e){return Ao.includes(basename$1(e))}function isLikeC4NonJsonConfig(e){return jo.includes(basename$1(e))}function isLikeC4Config(e){return isLikeC4JsonConfig(e)||isLikeC4NonJsonConfig(e)}const Mo=Eo.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await ni.readFile(e,`utf-8`),r;try{r=mi.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let s=Mo.safeParse(r);if(!s.success)throw Error(`${e}: Invalid config\n`+I.prettifyError(s.error));return s.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let r=t.indexOf(e),s=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${s}`)}let r=await parseJsonConfig(e),s=normalizeExtends(r.extends),c=[...t,e],u=[];for(let t of s){let r=Qr(Xr(e),t);u.push(...await loadJsonConfigs(r,c))}return[...u,r]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,xa.getChild(`config`).trace`Loading config: ${Zr($r(),e)}`;let t=Xr(e),r=Yr(e),s={name:Yr(t)};if(isLikeC4JsonConfig(r)){let t=await loadJsonConfigs(Qr(e),[]);invariant(j(t,1),`Expect at least one config`);let r=oe(ke(t),[`extends`,`styles`]),c=t.map(e=>e.styles).filter(ce),u=c.length>0?Qi({},...c.reverse()):void 0;return validateProjectConfig({...s,...r,...u?{styles:u}:{}})}invariant(isLikeC4NonJsonConfig(r),`Invalid name for config file: ${e}`);let{mod:c}=await hi({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=gi(e.errors,{kind:`error`});for(let e of t)xa.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
63
63
  // Mock implementation to allow loading config files without bundling @likec4/config
64
64
  function mock(x) { return x }
65
65
  export {
@@ -68,72 +68,73 @@ export {
68
68
  mock as defineStyle,
69
69
  mock as defineTheme,
70
70
  mock as defineThemeColor,
71
- }`,loader:`js`}))}}]}});return validateProjectConfig(Object.assign(s,c?.default??c))}const So=[`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(`
72
- `),Co=`likec4builtin`,wo=`${Co}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===Co}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}var To=e(wr(),1),ADisposable=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){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&Y.warn(`this has already been disposed`)}};const Eo=`AnyProperty`;function isAnyProperty(e){return X.isInstance(e,Eo)}const Do=`ColorLiteral`;function isColorLiteral(e){return X.isInstance(e,Do)}const Oo=`DeploymentElement`;function isDeploymentElement(e){return X.isInstance(e,Oo)}const ko=`DeploymentNodeOrElementKind`,Ao=`DeploymentViewRule`;function isDeploymentViewRule(e){return X.isInstance(e,Ao)}const jo=`DynamicViewProperty`,Mo=`DynamicViewRule`;function isDynamicViewRule(e){return X.isInstance(e,Mo)}const No=`DynamicViewStep`;function isDynamicViewStep(e){return X.isInstance(e,No)}const Po=`ElementProperty`;function isElementProperty(e){return X.isInstance(e,Po)}const Fo=`ExpressionV2`;function isExpressionV2(e){return X.isInstance(e,Fo)}const Io=`FqnExpr`;function isFqnExpr(e){return X.isInstance(e,Io)}const Lo=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return X.isInstance(e,Lo)}const Ro=`FqnExprOrWith`;function isFqnExprOrWith(e){return X.isInstance(e,Ro)}const zo=`FqnReferenceable`,Bo=`LikeC4View`;function isLikeC4View(e){return X.isInstance(e,Bo)}const Vo=`MetadataProperty`;function isMetadataProperty(e){return X.isInstance(e,Vo)}const Ho=`MetadataValue`,Uo=`Referenceable`,Wo=`RelationExpr`;function isRelationExpr(e){return X.isInstance(e,Wo)}const Go=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return X.isInstance(e,Go)}const Ko=`RelationExprOrWith`;function isRelationExprOrWith(e){return X.isInstance(e,Ko)}const qo=`RelationProperty`,Jo=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return X.isInstance(e,Jo)}const Yo=`SizeProperty`;function isSizeProperty(e){return X.isInstance(e,Yo)}const Xo=`StringProperty`;function isStringProperty(e){return X.isInstance(e,Xo)}const Zo=`StyleProperty`;function isStyleProperty(e){return X.isInstance(e,Zo)}const Qo=`ViewProperty`;function isViewProperty(e){return X.isInstance(e,Qo)}const $o=`ViewRule`;function isViewRule(e){return X.isInstance(e,$o)}const es=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return X.isInstance(e,es)}const ts=`WhereElement`;function isWhereElement(e){return X.isInstance(e,ts)}const ns=`WhereElementExpression`;function isWhereElementExpression(e){return X.isInstance(e,ns)}const rs=`WhereExpression`,as=`WhereKindEqual`;function isWhereKindEqual(e){return X.isInstance(e,as)}const os=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return X.isInstance(e,os)}const ss=`WhereRelation`;function isWhereRelation(e){return X.isInstance(e,ss)}const cs=`WhereRelationExpression`;function isWhereRelationExpression(e){return X.isInstance(e,cs)}const ls=`WhereTagEqual`;function isWhereTagEqual(e){return X.isInstance(e,ls)}const us=`AbstractDynamicStep`,ds=`ArrowProperty`;function isArrowProperty(e){return X.isInstance(e,ds)}const fs=`BorderProperty`;function isBorderProperty(e){return X.isInstance(e,fs)}const ps=`ColorProperty`;function isColorProperty(e){return X.isInstance(e,ps)}const ms=`CustomColor`,hs=`CustomElementProperties`;function isCustomElementProperties(e){return X.isInstance(e,hs)}const gs=`CustomRelationProperties`;function isCustomRelationProperties(e){return X.isInstance(e,gs)}const _s=`DeployedInstance`;function isDeployedInstance(e){return X.isInstance(e,_s)}const vs=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return X.isInstance(e,vs)}const ys=`DeploymentNode`;function isDeploymentNode(e){return X.isInstance(e,ys)}const bs=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return X.isInstance(e,bs)}const xs=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return X.isInstance(e,xs)}const Ss=`DeploymentRelation`;function isDeploymentRelation(e){return X.isInstance(e,Ss)}const Cs=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return X.isInstance(e,Cs)}const ws=`DeploymentView`;function isDeploymentView(e){return X.isInstance(e,ws)}const Ts=`DeploymentViewBody`;function isDeploymentViewBody(e){return X.isInstance(e,Ts)}const Es=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return X.isInstance(e,Es)}const Ds=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return X.isInstance(e,Ds)}const Os=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return X.isInstance(e,Os)}const ks=`DynamicView`;function isDynamicView(e){return X.isInstance(e,ks)}const As=`DynamicViewBody`;function isDynamicViewBody(e){return X.isInstance(e,As)}const js=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return X.isInstance(e,js)}const Ms=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return X.isInstance(e,Ms)}const Ns=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return X.isInstance(e,Ns)}const Ps=`DynamicViewParallelSteps`;function isDynamicViewParallelSteps(e){return X.isInstance(e,Ps)}const Fs=`DynamicViewRef`,Is=`Element`;function isElement(e){return X.isInstance(e,Is)}const Ls=`ElementBody`;function isElementBody(e){return X.isInstance(e,Ls)}const Rs=`ElementKind`;function isElementKind(e){return X.isInstance(e,Rs)}const zs=`ElementKindExpression`;function isElementKindExpression(e){return X.isInstance(e,zs)}const Bs=`ElementRef`;function isElementRef(e){return X.isInstance(e,Bs)}const Vs=`ElementStringProperty`;function isElementStringProperty(e){return X.isInstance(e,Vs)}const Hs=`ElementStyleProperty`;function isElementStyleProperty(e){return X.isInstance(e,Hs)}const Us=`ElementTagExpression`;function isElementTagExpression(e){return X.isInstance(e,Us)}const Ws=`ElementView`;function isElementView(e){return X.isInstance(e,Ws)}const Gs=`ElementViewBody`;function isElementViewBody(e){return X.isInstance(e,Gs)}const Ks=`ElementViewRef`,qs=`Expressions`;function isExpressions(e){return X.isInstance(e,qs)}const Js=`ExtendDeployment`;function isExtendDeployment(e){return X.isInstance(e,Js)}const Ys=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return X.isInstance(e,Ys)}const Xs=`ExtendElement`;function isExtendElement(e){return X.isInstance(e,Xs)}const Zs=`ExtendElementBody`;function isExtendElementBody(e){return X.isInstance(e,Zs)}const Qs=`ExtendRelation`;function isExtendRelation(e){return X.isInstance(e,Qs)}const $s=`ExtendRelationBody`;function isExtendRelationBody(e){return X.isInstance(e,$s)}const ec=`FqnExpressions`;function isFqnExpressions(e){return X.isInstance(e,ec)}const tc=`FqnExprWhere`;function isFqnExprWhere(e){return X.isInstance(e,tc)}const nc=`FqnExprWith`;function isFqnExprWith(e){return X.isInstance(e,nc)}const rc=`FqnRef`;function isFqnRef(e){return X.isInstance(e,rc)}const ic=`FqnRefExpr`;function isFqnRefExpr(e){return X.isInstance(e,ic)}const ac=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return X.isInstance(e,ac)}const oc=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return X.isInstance(e,oc)}const sc=`Globals`;function isGlobals(e){return X.isInstance(e,sc)}const cc=`GlobalStyle`;function isGlobalStyle(e){return X.isInstance(e,cc)}const lc=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return X.isInstance(e,lc)}const uc=`GlobalStyleId`,dc=`HexColor`;function isHexColor(e){return X.isInstance(e,dc)}const fc=`IconColorProperty`;function isIconColorProperty(e){return X.isInstance(e,fc)}const pc=`IconPositionProperty`;function isIconPositionProperty(e){return X.isInstance(e,pc)}const mc=`IconProperty`;function isIconProperty(e){return X.isInstance(e,mc)}const hc=`IconSizeProperty`;function isIconSizeProperty(e){return X.isInstance(e,hc)}const gc=`Imported`;function isImported(e){return X.isInstance(e,gc)}const _c=`ImportsFromPoject`;function isImportsFromPoject(e){return X.isInstance(e,_c)}const vc=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return X.isInstance(e,vc)}const yc=`InOutRelationExpr`;function isInOutRelationExpr(e){return X.isInstance(e,yc)}const bc=`LibIcon`;function isLibIcon(e){return X.isInstance(e,bc)}const xc=`LikeC4Grammar`;function isLikeC4Grammar(e){return X.isInstance(e,xc)}const Sc=`LikeC4Lib`;function isLikeC4Lib(e){return X.isInstance(e,Sc)}const Cc=`LineProperty`;function isLineProperty(e){return X.isInstance(e,Cc)}const wc=`LinkProperty`;function isLinkProperty(e){return X.isInstance(e,wc)}const Tc=`MarkdownOrString`;function isMarkdownOrString(e){return X.isInstance(e,Tc)}const Ec=`MetadataArray`;function isMetadataArray(e){return X.isInstance(e,Ec)}const Dc=`MetadataAttribute`;function isMetadataAttribute(e){return X.isInstance(e,Dc)}const Oc=`MetadataBody`;function isMetadataBody(e){return X.isInstance(e,Oc)}const kc=`Model`;function isModel(e){return X.isInstance(e,kc)}const Ac=`ModelDeployments`;function isModelDeployments(e){return X.isInstance(e,Ac)}const jc=`ModelViews`;function isModelViews(e){return X.isInstance(e,jc)}const Mc=`MultipleProperty`;function isMultipleProperty(e){return X.isInstance(e,Mc)}const Nc=`NavigateToProperty`;function isNavigateToProperty(e){return X.isInstance(e,Nc)}const Pc=`NotationProperty`;function isNotationProperty(e){return X.isInstance(e,Pc)}const Fc=`NotesProperty`;function isNotesProperty(e){return X.isInstance(e,Fc)}const Ic=`OpacityProperty`;function isOpacityProperty(e){return X.isInstance(e,Ic)}const Lc=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return X.isInstance(e,Lc)}const Rc=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return X.isInstance(e,Rc)}const zc=`Relation`;function isRelation(e){return X.isInstance(e,zc)}const Bc=`RelationBody`;function isRelationBody(e){return X.isInstance(e,Bc)}const Vc=`RelationExprWhere`;function isRelationExprWhere(e){return X.isInstance(e,Vc)}const Hc=`RelationExprWith`;function isRelationExprWith(e){return X.isInstance(e,Hc)}const Uc=`RelationKindDotRef`;function isRelationKindDotRef(e){return X.isInstance(e,Uc)}const Wc=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return X.isInstance(e,Wc)}const Gc=`RelationshipKind`;function isRelationshipKind(e){return X.isInstance(e,Gc)}const Kc=`RelationStringProperty`;function isRelationStringProperty(e){return X.isInstance(e,Kc)}const qc=`RelationStyleProperty`;function isRelationStyleProperty(e){return X.isInstance(e,qc)}const Jc=`RGBAColor`;function isRGBAColor(e){return X.isInstance(e,Jc)}const Yc=`ShapeProperty`;function isShapeProperty(e){return X.isInstance(e,Yc)}const Xc=`ShapeSizeProperty`;function isShapeSizeProperty(e){return X.isInstance(e,Xc)}const Zc=`SpecificationColor`;function isSpecificationColor(e){return X.isInstance(e,Zc)}const Qc=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return X.isInstance(e,Qc)}const $c=`SpecificationElementKind`;function isSpecificationElementKind(e){return X.isInstance(e,$c)}const el=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return X.isInstance(e,el)}const tl=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return X.isInstance(e,tl)}const nl=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return X.isInstance(e,nl)}const rl=`SpecificationRule`;function isSpecificationRule(e){return X.isInstance(e,rl)}const il=`SpecificationTag`;function isSpecificationTag(e){return X.isInstance(e,il)}const al=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return X.isInstance(e,al)}const ol=`StrictFqnRef`;function isStrictFqnRef(e){return X.isInstance(e,ol)}function isTag(e){return X.isInstance(e,`Tag`)}const sl=`TagRef`;function isTagRef(e){return X.isInstance(e,sl)}const cl=`Tags`;function isTags(e){return X.isInstance(e,cl)}const ll=`TextSizeProperty`;function isTextSizeProperty(e){return X.isInstance(e,ll)}const ul=`ViewRef`,dl=`ViewRuleAncestors`;function isViewRuleAncestors(e){return X.isInstance(e,dl)}const fl=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return X.isInstance(e,fl)}const pl=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return X.isInstance(e,pl)}const ml=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return X.isInstance(e,ml)}const hl=`ViewRuleGroup`;function isViewRuleGroup(e){return X.isInstance(e,hl)}const gl=`ViewRulePredicate`;function isViewRulePredicate(e){return X.isInstance(e,gl)}const _l=`ViewRuleRank`;function isViewRuleRank(e){return X.isInstance(e,_l)}const vl=`ViewRuleStyle`;function isViewRuleStyle(e){return X.isInstance(e,vl)}const yl=`ViewStringProperty`;function isViewStringProperty(e){return X.isInstance(e,yl)}const bl=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return X.isInstance(e,bl)}const xl=`WhereElementKind`;function isWhereElementKind(e){return X.isInstance(e,xl)}const Sl=`WhereElementMetadata`;function isWhereElementMetadata(e){return X.isInstance(e,Sl)}const Cl=`WhereElementNegation`;function isWhereElementNegation(e){return X.isInstance(e,Cl)}const wl=`WhereElementTag`;function isWhereElementTag(e){return X.isInstance(e,wl)}const Tl=`WhereRelationKind`;function isWhereRelationKind(e){return X.isInstance(e,Tl)}const El=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return X.isInstance(e,El)}const Dl=`WhereRelationNegation`;function isWhereRelationNegation(e){return X.isInstance(e,Dl)}const Ol=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return X.isInstance(e,Ol)}const kl=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return X.isInstance(e,kl)}const Al=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return X.isInstance(e,Al)}const jl=`WhereRelationTag`;function isWhereRelationTag(e){return X.isInstance(e,jl)}const Ml=`WildcardExpression`;function isWildcardExpression(e){return X.isInstance(e,Ml)}const Nl=`DynamicStepChain`;function isDynamicStepChain(e){return X.isInstance(e,Nl)}const Pl=`DynamicStepSingle`;function isDynamicStepSingle(e){return X.isInstance(e,Pl)}var LikeC4AstReflection=class extends gn{getAllTypes(){return[us,Eo,ds,fs,Do,ps,ms,hs,gs,_s,vs,Oo,ys,bs,xs,ko,Ss,Cs,ws,Ts,Ao,Es,Ds,Os,Nl,Pl,ks,As,js,Ms,Ns,Ps,jo,Fs,Mo,No,Is,Ls,Rs,zs,Po,Bs,Vs,Hs,Us,Ws,Gs,Ks,Fo,qs,Js,Ys,Xs,Zs,`ExtendElementProperty`,Qs,$s,`ExtendRelationProperty`,Io,Lo,Ro,tc,nc,ec,rc,ic,zo,ac,oc,cc,lc,uc,sc,dc,fc,pc,mc,hc,gc,_c,yc,vc,bc,xc,Sc,Bo,Cc,wc,Tc,Ec,Dc,Oc,Vo,Ho,kc,Ac,`ModelReferenceable`,jc,Mc,Nc,Pc,Fc,Ic,Lc,Rc,Jc,Uo,zc,Bc,Wo,Go,Ko,Vc,Hc,Uc,Wc,qo,Kc,qc,Gc,Jo,Yc,Xc,Yo,Zc,Qc,$c,el,tl,nl,rl,il,al,ol,Xo,Zo,`Tag`,sl,cl,ll,Qo,ul,$o,dl,fl,pl,ml,hl,gl,_l,vl,es,yl,bl,ts,ns,xl,Sl,Cl,wl,rs,as,os,ss,cs,Tl,El,Dl,Ol,kl,Al,jl,ls,Ml]}computeIsSubtype(e,t){switch(e){case ds:case Cc:return this.isSubtype(Jo,t);case fs:case fc:case pc:case Mc:case Ic:case Yc:return this.isSubtype(Zo,t);case ps:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case _s:case ys:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case xs:case Rs:return this.isSubtype(ko,t);case ws:case ks:case Ws:return this.isSubtype(Bo,t);case Es:case Ds:case dl:return this.isSubtype(Ao,t);case Os:case vc:case yc:case Lc:return this.isSubtype(Wo,t);case Nl:case Pl:return this.isSubtype(`AbstractDynamicStep`,t)||this.isSubtype(`DynamicViewStep`,t);case js:return this.isSubtype(jo,t);case Ms:case Ns:return this.isSubtype(Mo,t);case jo:case Po:case Nc:case qo:case Jo:case Xo:case Zo:return this.isSubtype(Eo,t);case Is:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case zs:case Us:case ic:case Ml:return this.isSubtype(Io,t);case Vs:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case Hs:return this.isSubtype(Po,t);case Js:case Xs:case Uo:return this.isSubtype(zo,t);case Io:case tc:return this.isSubtype(Lo,t);case Lo:case nc:return this.isSubtype(Ro,t);case Ro:case Ko:return this.isSubtype(Fo,t);case dc:case Jc:return this.isSubtype(Do,t);case mc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case hc:case Rc:case Xc:case ll:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case gc:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case wc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case Tc:case Ec:return this.isSubtype(Ho,t);case Dc:case el:case nl:return this.isSubtype(Xo,t);case Oc:return this.isSubtype(Vo,t);case Vo:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case Pc:case Fc:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`StringProperty`,t);case Wo:case Vc:return this.isSubtype(Go,t);case Go:case Hc:return this.isSubtype(Ko,t);case Wc:case qc:return this.isSubtype(qo,t);case Kc:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case Qo:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case fl:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case pl:case hl:case gl:case _l:return this.isSubtype($o,t);case ml:case vl:return this.isSubtype(es,t);case es:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case yl:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case bl:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case ts:case Cl:return this.isSubtype(ns,t);case ns:case cs:return this.isSubtype(rs,t);case xl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Sl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case wl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case ss:case Dl:return this.isSubtype(cs,t);case Tl:case Ol:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case El:case kl:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case Al:case jl:return this.isSubtype(`WhereRelation`,t)||this.isSubtype(`WhereTagEqual`,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 Gc;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return ms;case`DeploymentNode:kind`:return xs;case`DynamicViewGlobalPredicateRef:predicate`:return ac;case`DynamicViewRef:view`:return ks;case`Element:kind`:case`ElementKindExpression:kind`:return Rs;case`ElementViewRef:view`:return Ws;case`FqnRef:value`:case`StrictFqnRef:value`:return Uo;case`IconProperty:libicon`:return bc;case`Imported:imported`:case`StrictFqnElementRef:el`:return Is;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Bo;case`ViewRuleGlobalPredicateRef:predicate`:return oc;case`ViewRuleGlobalStyle:style`:return uc;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return ko;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case us:return{name:us,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case ds:return{name:ds,properties:[{name:`key`},{name:`value`}]};case fs:return{name:fs,properties:[{name:`key`},{name:`value`}]};case ps:return{name:ps,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case ms:return{name:ms,properties:[{name:`name`}]};case hs:return{name:hs,properties:[{name:`props`,defaultValue:[]}]};case gs:return{name:gs,properties:[{name:`props`,defaultValue:[]}]};case _s:return{name:_s,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case vs:return{name:vs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ys:return{name:ys,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case bs:return{name:bs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case xs:return{name:xs,properties:[{name:`name`}]};case Ss:return{name:Ss,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Cs:return{name:Cs,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ws:return{name:ws,properties:[{name:`body`},{name:`name`}]};case Ts:return{name:Ts,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Es:return{name:Es,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Ds:return{name:Ds,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Os:return{name:Os,properties:[{name:`source`},{name:`target`}]};case ks:return{name:ks,properties:[{name:`body`},{name:`name`}]};case As:return{name:As,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case js:return{name:js,properties:[{name:`key`},{name:`value`}]};case Ms:return{name:Ms,properties:[{name:`predicate`}]};case Ns:return{name:Ns,properties:[{name:`exprs`}]};case Ps:return{name:Ps,properties:[{name:`steps`,defaultValue:[]}]};case Fs:return{name:Fs,properties:[{name:`view`}]};case Is:return{name:Is,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Ls:return{name:Ls,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Rs:return{name:Rs,properties:[{name:`name`}]};case zs:return{name:zs,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Bs:return{name:Bs,properties:[{name:`modelElement`}]};case Vs:return{name:Vs,properties:[{name:`key`},{name:`value`}]};case Hs:return{name:Hs,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Us:return{name:Us,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Ws:return{name:Ws,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Gs:return{name:Gs,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Ks:return{name:Ks,properties:[{name:`view`}]};case qs:return{name:qs,properties:[{name:`prev`},{name:`value`}]};case Js:return{name:Js,properties:[{name:`body`},{name:`deploymentNode`}]};case Ys:return{name:Ys,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Xs:return{name:Xs,properties:[{name:`body`},{name:`element`}]};case Zs:return{name:Zs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Qs:return{name:Qs,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case $s:return{name:$s,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ec:return{name:ec,properties:[{name:`prev`},{name:`value`}]};case tc:return{name:tc,properties:[{name:`subject`},{name:`where`}]};case nc:return{name:nc,properties:[{name:`custom`},{name:`subject`}]};case rc:return{name:rc,properties:[{name:`parent`},{name:`value`}]};case ic:return{name:ic,properties:[{name:`ref`},{name:`selector`}]};case ac:return{name:ac,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case oc:return{name:oc,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case sc:return{name:sc,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case cc:return{name:cc,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case lc:return{name:lc,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case uc:return{name:uc,properties:[{name:`name`}]};case dc:return{name:dc,properties:[{name:`hex`}]};case fc:return{name:fc,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case pc:return{name:pc,properties:[{name:`key`},{name:`value`}]};case mc:return{name:mc,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case hc:return{name:hc,properties:[{name:`key`},{name:`value`}]};case gc:return{name:gc,properties:[{name:`imported`},{name:`prev`}]};case _c:return{name:_c,properties:[{name:`imports`},{name:`project`}]};case vc:return{name:vc,properties:[{name:`to`}]};case yc:return{name:yc,properties:[{name:`inout`}]};case bc:return{name:bc,properties:[{name:`name`}]};case xc:return{name:xc,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Sc:return{name:Sc,properties:[{name:`icons`,defaultValue:[]}]};case Cc:return{name:Cc,properties:[{name:`key`},{name:`value`}]};case wc:return{name:wc,properties:[{name:`key`},{name:`title`},{name:`value`}]};case Tc:return{name:Tc,properties:[{name:`markdown`},{name:`text`}]};case Ec:return{name:Ec,properties:[{name:`values`,defaultValue:[]}]};case Dc:return{name:Dc,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case Oc:return{name:Oc,properties:[{name:`props`,defaultValue:[]}]};case kc:return{name:kc,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Ac:return{name:Ac,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case jc:return{name:jc,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Mc:return{name:Mc,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Nc:return{name:Nc,properties:[{name:`key`},{name:`value`}]};case Pc:return{name:Pc,properties:[{name:`key`},{name:`value`}]};case Fc:return{name:Fc,properties:[{name:`key`},{name:`value`}]};case Ic:return{name:Ic,properties:[{name:`key`},{name:`value`}]};case Lc:return{name:Lc,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Rc:return{name:Rc,properties:[{name:`key`},{name:`value`}]};case zc:return{name:zc,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Bc:return{name:Bc,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Vc:return{name:Vc,properties:[{name:`subject`},{name:`where`}]};case Hc:return{name:Hc,properties:[{name:`custom`},{name:`subject`}]};case Uc:return{name:Uc,properties:[{name:`kind`}]};case Wc:return{name:Wc,properties:[{name:`key`},{name:`value`}]};case Gc:return{name:Gc,properties:[{name:`name`}]};case Kc:return{name:Kc,properties:[{name:`key`},{name:`value`}]};case qc:return{name:qc,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Jc:return{name:Jc,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Yc:return{name:Yc,properties:[{name:`key`},{name:`value`}]};case Xc:return{name:Xc,properties:[{name:`key`},{name:`value`}]};case Zc:return{name:Zc,properties:[{name:`color`},{name:`name`}]};case Qc:return{name:Qc,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case $c:return{name:$c,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case el:return{name:el,properties:[{name:`key`},{name:`value`}]};case tl:return{name:tl,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case nl:return{name:nl,properties:[{name:`key`},{name:`value`}]};case rl:return{name:rl,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case il:return{name:il,properties:[{name:`color`},{name:`tag`}]};case al:return{name:al,properties:[{name:`el`},{name:`parent`}]};case ol:return{name:ol,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case sl:return{name:sl,properties:[{name:`tag`}]};case cl:return{name:cl,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case ll:return{name:ll,properties:[{name:`key`},{name:`value`}]};case ul:return{name:ul,properties:[{name:`view`}]};case dl:return{name:dl,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case fl:return{name:fl,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case pl:return{name:pl,properties:[{name:`predicate`}]};case ml:return{name:ml,properties:[{name:`style`}]};case hl:return{name:hl,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case gl:return{name:gl,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case _l:return{name:_l,properties:[{name:`targets`},{name:`value`}]};case vl:return{name:vl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case yl:return{name:yl,properties:[{name:`key`},{name:`value`}]};case bl:return{name:bl,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case xl:return{name:xl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Sl:return{name:Sl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Cl:return{name:Cl,properties:[{name:`value`}]};case wl:return{name:wl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Tl:return{name:Tl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case El:return{name:El,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Dl:return{name:Dl,properties:[{name:`value`}]};case Ol:return{name:Ol,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case kl:return{name:kl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Al:return{name:Al,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case jl:return{name:jl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Ml:return{name:Ml,properties:[{name:`isWildcard`,defaultValue:!1}]};case Nl:return{name:Nl,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Pl:return{name:Pl,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const X=new LikeC4AstReflection;let Fl;const LikeC4Grammar=()=>Fl??=nr(`{"$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@124"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@162"},"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@166"},"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@166"},"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@166"},"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@165"},"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@166"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"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@164"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"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@159"},"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@159"},"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@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"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@164"},"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@187"},"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@166"},"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@166"},"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@151"},"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@151"},"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@166"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"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@187"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"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@164"},"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@130"},"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@152"},"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@187"},"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@130"},"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@166"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@166"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@166"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@152"},"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@187"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@130"},"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@164"},"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@150"},"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@166"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"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@164"},"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@164"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@187"},"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@118"},"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@166"},"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@166"},"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@155"},"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@130"},"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@164"},"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@187"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"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":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$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@187"},"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@152"},"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@152"},"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@125"},"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@126"},"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@146"},"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@127"},"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@189"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"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@164"},"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@164"},"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@146"},"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@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"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@103"},"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@168"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"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@178"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"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@166"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"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@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"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@105"},"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@105"},"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@106"},"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@106"},"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@103"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"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@103"},"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@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]}]},"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@110"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"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@166"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"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@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"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@187"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"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@116"},"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@115"},"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@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@116/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@116/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@152"},"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@187"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@117"},"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@166"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"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@120"},"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@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"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@146"},"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@125"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"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@190"},"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@190"},"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@190"},"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@127"},"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@146"},"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@127"},"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@163"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@156"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@185"},"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@173"},"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@162"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@156"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@142"},"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@137"},"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@157"},"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@153"},"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@140"},"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@142"},"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@142"},"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@142"},"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@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"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@146"},"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@153"},"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@154"},"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@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@160"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"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@189"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@180"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"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@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"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@186"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"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@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"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"},{"$type":"Keyword","value":"relationship"}]},"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@184"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@184"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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]|_+[a-zA-Z0-9])[-\\\\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@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}},{"$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@118"}}]}},{"$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":"SimpleType","typeRef":{"$ref":"#/rules@150"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@146"}}]}},{"$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@108/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@3/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@108/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@4/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@5/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@103"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}}]}},{"$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@114"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@145"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@136"}}]}}],"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@152"}}},{"$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":[]}`),Il={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Ll={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Rl={AstReflection:()=>new LikeC4AstReflection},zl={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>Il,parser:{ParserConfig:()=>Ll}},Bl=Symbol.for(`idattr`),Vl={writeId(e,t){return e[Bl]=t,e},readId(e){return e[Bl]}},Hl={writeId(e,t){return k(t)?e[Bl]=void 0:e[Bl]=t,e},readId(e){return e[Bl]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===Il.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:Oe(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({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:nonexhaustive(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:nonexhaustive(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let s of e)if(t(s))switch(!0){case isColorProperty(s):{let e=toColor(s);T(e)&&(r.color=e);break}case isLineProperty(s):r.line=s.value;break;case isArrowProperty(s):switch(s.key){case`head`:r.head=s.value;break;case`tail`:r.tail=s.value;break;default:nonexhaustive(s)}break;default:nonexhaustive(s)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,s;switch(e.direction){case`TopBottom`:s=`TB`;break;case`BottomTop`:s=`BT`;break;case`LeftRight`:s=`LR`;break;case`RightLeft`:s=`RL`;break;default:nonexhaustive(e.direction)}return{direction:s,...r&&{nodeSep:r},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:nonexhaustive(e)}}function getViewRulePredicateContainer(e){return dn(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),Ul=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(Ul(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(Ul(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(Ul(e))return!0;if(e.$container)e=e.$container;else return!1}}function elementRef(e){try{let t=isStrictFqnElementRef(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 readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode(t))return null;if(isDeployedInstance(t))return t;if(k(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(k(e.parent))return!1;e=e.parent}return!1}var AstNodeDescriptionProvider=class extends Qn{services;constructor(e){super(e),this.services=e}createDescription(e,t,r){r??=un(e);let s=super.createDescription(e,t,r);return isLikeC4Builtin(r.uri)||(r.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(r),s.likec4ProjectId=r.likec4ProjectId),s}},IndexManager=class extends pn{services;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,r){let s=this.services.workspace.ProjectsManager;return Yn(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:s.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const Wl=compareNaturalHierarchically(`/`),Gl=t((e,t)=>Wl(e.uri.path,t.uri.path),`ensureOrder`);var LangiumDocuments=class extends tn{services;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 r=[...this.documentMap.values(),e].sort(Gl);this.documentMap.clear();for(let e of r)this.documentMap.set(e.uri.toString(),e);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return Yn(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return Yn(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return Yn(this.documentMap.values()).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return N(this.userDocuments.toArray(),D(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),se(M(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}};const Z=Y.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?Ir(e,{acceptRelative:!1,strict:!0})?e:R.file(e).toString():e.toString()}const Kl=compareNaturalHierarchically(`/`,!0),compareUri=(e,t)=>Kl(jr(e.path),jr(t.path));function isParentFolderFor(e){return t=>e.startsWith(isString(t)?t:t.folder)}function _overlaps(e,t){let r=isString(e)?e:e.folder,s=isString(t)?t:t.folder;return r===s||r.startsWith(s)||s.startsWith(r)}function overlaps(...e){return Ue(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _excludes(e,t){return e.exclude?.(zr(t))??!1}function includes(...e){return Ue(_includes,e)}function excludes(...e){return Ue(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),Lr(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:me(e,compareProjectByFolder)}const ql={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,To.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return ql.exclude(zr(e))}function parseRegisterOptions(e){if(`configUri`in e){invariant(!y(e.configUri),`configUri is emptyish`);let t=R.isUri(e.configUri)?e.configUri:R.parse(normalizeUri(e.configUri)),r=ProjectFolder(cn.dirname(t));return{configUri:t,folder:r,folderUri:R.parse(r)}}invariant(!y(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=R.parse(t);return{configUri:cn.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var Jl=class ProjectsManager extends ADisposable{services;static DefaultProjectId=ql.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new L.default(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=cn.joinPath(t,`likec4.config.json`),s=ProjectFolder(t);return{id:e,config:ql.config,folder:s,folderUri:R.parse(s),configUri:r,exclude:ql.exclude,includeConfig:{...ql.includeConfig}}}return nonNullable(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new L.default(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.#o.get(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:isExcludedByDefault(e)});#o=new L.default(e=>{if(this.#r.length===0)return null;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??null});constructor(e){super(),this.services=e,this.onDispose(_n.create(()=>{this.resetCaches(),this.#e.length=0})),Z.trace`created`}isExcludedByWorkspace(e){return this.#n?(R.isUri(e)&&(e=normalizeUri(e)),this.#n(zr(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=N(e,F(T),D(e=>(!Or(e)&&!e.startsWith(`**`)&&(e=Fr(`**`,e)),e)));if(!P(t,1)){this.#n=void 0;return}Z.debug`set workspace exclude patterns: ${t}`,this.#n=(0,To.default)(t,{dot:!0})}catch(e){Z.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return P(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId){Z.debug`reset default project ID`;return}invariant(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Z.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(P(this.#r,1)){let e=[...D(this.#r,M(`id`)),ql.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[ql.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!ue(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(invariant(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):nonNullable(this.defaultProjectId,()=>`Specify exact project, known: [${D(this.#r,M(`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 isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:P(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!isExcludedByDefault(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${ql.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!rn(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=vo.validate(e.config),{configUri:s,folder:c,folderUri:u}=parseRegisterOptions(e),d=vo.normalizeInclude(r.include),p=this.#r.find(e=>e.folder===c);return p?(p.config.name!==r.name&&(Z.info`project name changed from ${p.config.name} to ${r.name}`,Z.info`remove ${p.id}`,p.id=this.uniqueProjectId(r.name),Z.info`add ${p.id}`),this.warnIfConfigOverride(p,s),p.config=r,p.folder=c,p.folderUri=u,p.configUri=s,p.includeConfig=d):(p={id:this.uniqueProjectId(r.name),config:r,folder:c,configUri:s,folderUri:u,includeConfig:d},this.#r=ensureProjectsOrder([...this.#r,p]),Z.info`add ${p.id}`),safeCall(()=>this.updateIncludesExcludes(p)),this.isInitiatingOrReloading?p:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(p.id,t).catch(e=>rn(e)?Promise.reject(e):(Z.warn(`Failed to rebuild project {projectId} after config change`,{projectId:p.id,error:e}),Promise.resolve())),p)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?cn.relative(r.folderUri,R.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Z.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Z.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(rn(e)||Z.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Z.warn(`Failed to reloadProjects, no workspace folders found`);return}Z.debug`start reload projects`;let r=[];for(let e of t){let t=R.parse(e.uri);Z.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let s of e)Z.debug`found config ${cn.relative(t,s.uri)}`,r.push(s.uri)}catch(e){Z.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Z.warning(`No config files found`);return}Z.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Z.warning(`reset`)}r.sort(compareUri);let s=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Z.warn(loggable(t));let r=s.get(e.toString());r&&(Z.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Z.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(D(this.#r,M(`id`))),r=e;if(!t.has(r))return r;Z.warn`Project "${e}" already exists, generating unique ID`;let s=1;for(;t.has(r);)r=`${e}-${s++}`;return r}resetCaches(){Z.trace(`resetCaches`),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(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Z.info`Rebuilding all documents `:Z.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let s=Z.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),c=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(c.length===0){s.trace`no documents found for project ${r.id}, skipping rebuild`;return}s.info`rebuild project documents: ${c.length}`,this.resetCaches(),await this.services.workspace.DocumentBuilder.update(c,[],t).catch(e=>{s.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),_n.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 Z.warn(`Failed to get workspace URI, using default folder`,{error:e}),R.file(`/`)}}notifyListeners(){for(let e of[...this.#e])try{e()}catch(e){Z.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case k(t.exclude):e.exclude=ql.exclude;break;case t.exclude&&P(t.exclude,1):e.exclude=(0,To.default)(D(t.exclude,t=>(!Mr(t)&&!t.startsWith(`**`)&&(t=Fr(`**`,t)),Rr(kr(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let r=e.includeConfig.paths;if(!P(r,1))return e;e.includePaths=D(r,t=>{let r=cn.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Z.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Z.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:r.id}),r.includePaths?.forEach(s=>{overlaps(t,s)&&Z.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:r.id,otherIncludePath:s.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,s]=D([e.configUri,t],cn.basename);r!==s&&Z.warn`config ${s} overrides ${r} in folder ${e.folder}`}catch{}}},Yl=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:s,message:c,customTimers:u={setTimeout,clearTimeout},signal:d}=t,p,abortHandler,m=new Promise((t,m)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(d?.aborted){m(getAbortedReason(d));return}if(d&&(abortHandler=()=>{m(getAbortedReason(d))},d.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,m),r===1/0)return;let h=new Yl;p=u.setTimeout.call(void 0,()=>{if(s){try{t(s())}catch(e){m(e)}return}typeof e.cancel==`function`&&e.cancel(),c===!1?t():c instanceof Error?m(c):(h.message=c??`Promise timed out after ${r} milliseconds`,m(h))},r)}).finally(()=>{m.clear(),abortHandler&&d&&d.removeEventListener(`abort`,abortHandler)});return m.clear=()=>{u.clearTimeout.call(void 0,p),p=void 0},m}function hasLikeC4Ext(e){return Il.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const Xl=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return Xl.includes(e)}function insideNodeModulesOrRepo(e){for(let t of Xl)if(e.includes(t))return!0;return!1}const Zl=compareNaturalHierarchically(`/`);function ensureOrder(e,t){return Zl(e.uri.path,t.uri.path)}var LikeC4WorkspaceManager=class extends Tn{services;documentFactory;fileSystemProvider;#e=!1;#t=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}get isReady(){return this.#e}async performStartup(e){try{this.#e=!1,await this.readExcludeConfig(),this.folders??=e;let t=[];for(let r of e)try{let e=R.parse(r.uri),s=await this.fileSystemProvider.scanProjectFiles(e);t.push(...s),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){logWarnError(e)}let r=this.services.workspace.ProjectsManager,s=0;for(let e of t)try{await r.registerConfigFile(e.uri),s++}catch(e){logWarnError(e)}return t.length!==s&&Y.warn`loaded ${s} projects out of ${t.length}`,await super.performStartup(e)}finally{this.#e=!0}}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(So,R.parse(wo)));let r=this.services.workspace.ProjectsManager.getAllIncludePaths(),s=qe(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),c=0,u=[];for(let{projectId:e,includePath:t,includeConfig:c}of r)try{Y.debug`scanning include path ${t.fsPath} for project ${e}`;let r=N(await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:c.maxDepth}),F(s));u.push(...r),r.length===0?Y.trace`no files found in include path ${t.fsPath}`:Y.debug`loaded ${r.length} files from include path ${t.fsPath}`}catch(e){Y.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Se(u,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),c++}catch(t){Y.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(r.length>0&&c>0){let e=Math.min(...r.map(e=>e.includeConfig.fileThreshold));c>e?Y.warn(`Loaded ${c} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):Y.info`loaded ${c} total files from ${r.length} include paths`}}async traverseFolder(e,t,r,s){let c=await this.fileSystemProvider.readDirectory(t,{recursive:!0});for(let t of c)if(this.includeEntry(e,t,r)){if(t.isDirectory){await this.traverseFolder(e,t.uri,r,s);continue}try{s(await this.langiumDocuments.getOrCreateDocument(t.uri))}catch(e){Y.warn(`Failed to load document {path}`,{error:e,path:t.uri.fsPath})}}}includeEntry(e,t,r){let s=cn.basename(t.uri);return t.isDirectory?!(isNodeModulesOrRepo(s)||this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri)):t.isFile?(r.fileExtensions.includes(cn.extname(t.uri))||r.fileNames.includes(s))&&!this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri):!1}workspace(){return this.folders&&P(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();Y.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 invariant(e,`Workspace not initialized`),R.parse(e.uri)}get workspaceURL(){let e=this.workspace();return invariant(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of[...this.#t])e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#t.push(e),_n.create(()=>{let t=this.#t.indexOf(e);t!==-1&&this.#t.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){Y.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{Y.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),Y.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(Y.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):Y.trace(`no initial exclude configuration found`)}catch(e){Y.warn(`Failed to read initial exclude configuration`,{error:e})}}};function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;invariant(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=Bn(e)?un(e):e;return t.likec4ProjectId?t.likec4ProjectId:(Y.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Jl.DefaultProjectId)}function stringHash(...e){return stringHash$1(e.length>1?e.join(`:::`):e[0])}function safeCall(e){try{return e()}catch(e){Y.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return Dr(performanceNow()-e)}}}var Ql=Tr();$n();const $l=Y.getChild(`manual-layouts`),eu=`.likec4.snap`,isManualLayoutFile=e=>e!==eu&&e.endsWith(eu);function fileName(e){return`${e}${eu}`}function viewIdFromURI(e){let t=cn.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return cn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const tu={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},nu=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=pLimit(1);constructor(e){super(),this.services=e,this.cache=new on,this.onDispose(_n.create(()=>{this.listeners.length=0,this.cache.clear()})),onNextTick(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}))})}async handleFileSystemUpdate(e){let t=e.update??e.delete,r=viewIdFromURI(t)??void 0,s=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(s),`delete`in e){this.triggerUpdate(exact({removed:t,projectId:s,viewId:r}));return}let c=this.services.workspace.ProjectsManager.getProject(s);if(!r){let e=await this.readSnapshot(t,c);e?r=e.id:($l.error(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate({updated:t,projectId:s,viewId:r})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=$l.getChild(e.id),r=this.services.workspace.FileSystemProvider,s=getManualLayoutsOutDir(e),c=[],u=`${s.toString()}`;try{let d=await r.scanDirectory(s,isManualLayoutFile);if(d.length===0)return null;d.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let s of d)try{let t=await r.readFile(s.uri),d=Fa.default.parse(t);u=stringHash$1(u+s.uri.toString()+t);let p=this.resolveIconPathsAfterRead(d,e.folderUri);c.push({...p,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${s.uri.fsPath}`,{err:e})}c.length&&t.trace`read manual layouts for ${e.id}, found ${c.length}`}catch(r){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:r})}if(c.length===0)return null;let d=Pe(c,M(`id`));return{hash:u,views:d}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let s=await r.readFile(e),c=Fa.default.parse(s);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(c,t.folderUri),_layout:`manual`}}catch(t){return $l.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return $l.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){this.cache.delete(e.id);let r=$l.getChild(e.id),s=getManualLayoutsOutDir(e),c=cn.joinPath(s,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let u=Fa.default.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),d={uri:c.toString(),range:Hn.create(wn.create(0,0),wn.create(u.split(`
71
+ }`,loader:`js`}))}}]}});return validateProjectConfig(Object.assign(s,c?.default??c))}const No={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(`.`)};Object.keys(No);const Po=[`likec4lib {`,` icons {`,...[...Object.entries(No)].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
72
+ `),Fo=`likec4builtin`,Io=`${Fo}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===Fo}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}const Lo=compareNaturalHierarchically(`/`),compareByUri=(e,t)=>Lo(xr(e.uri.path),xr(t.uri.path)),Ro=compareNaturalHierarchically(`/`,!0),compareByUriDeepFirst=(e,t)=>Ro(xr(e.uri.path),xr(t.uri.path));var ADisposable=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){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&Y.warn(`this has already been disposed`)}};const zo=`AnyProperty`;function isAnyProperty(e){return X.isInstance(e,zo)}const Bo=`ColorLiteral`;function isColorLiteral(e){return X.isInstance(e,Bo)}const Vo=`DeploymentElement`;function isDeploymentElement(e){return X.isInstance(e,Vo)}const Ho=`DeploymentNodeOrElementKind`,Uo=`DeploymentViewRule`;function isDeploymentViewRule(e){return X.isInstance(e,Uo)}const Wo=`DynamicViewProperty`,Go=`DynamicViewRule`;function isDynamicViewRule(e){return X.isInstance(e,Go)}const Ko=`ElementProperty`;function isElementProperty(e){return X.isInstance(e,Ko)}const qo=`ExpressionV2`;function isExpressionV2(e){return X.isInstance(e,qo)}const Jo=`ExtendElementOrRelation`;function isExtendElementOrRelation(e){return X.isInstance(e,Jo)}const Yo=`FqnExpr`;function isFqnExpr(e){return X.isInstance(e,Yo)}const Xo=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return X.isInstance(e,Xo)}const Zo=`FqnExprOrWith`;function isFqnExprOrWith(e){return X.isInstance(e,Zo)}const Qo=`FqnReferenceable`,$o=`LikeC4View`;function isLikeC4View(e){return X.isInstance(e,$o)}const es=`MetadataProperty`;function isMetadataProperty(e){return X.isInstance(e,es)}const ts=`MetadataValue`,ns=`ModelElement`,rs=`Referenceable`,as=`RelationExpr`;function isRelationExpr(e){return X.isInstance(e,as)}const os=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return X.isInstance(e,os)}const ss=`RelationExprOrWith`;function isRelationExprOrWith(e){return X.isInstance(e,ss)}const cs=`RelationProperty`,ls=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return X.isInstance(e,ls)}const us=`SizeProperty`;function isSizeProperty(e){return X.isInstance(e,us)}const ds=`StepOrSeries`;function isStepOrSeries(e){return X.isInstance(e,ds)}const fs=`StepStatement`;function isStepStatement(e){return X.isInstance(e,fs)}const ps=`StringProperty`;function isStringProperty(e){return X.isInstance(e,ps)}const ms=`StyleProperty`;function isStyleProperty(e){return X.isInstance(e,ms)}const hs=`TryStep`;function isTryStep(e){return X.isInstance(e,hs)}const gs=`ViewProperty`;function isViewProperty(e){return X.isInstance(e,gs)}const _s=`ViewRule`;function isViewRule(e){return X.isInstance(e,_s)}const vs=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return X.isInstance(e,vs)}const ys=`WhereElement`;function isWhereElement(e){return X.isInstance(e,ys)}const bs=`WhereElementExpression`;function isWhereElementExpression(e){return X.isInstance(e,bs)}const xs=`WhereExpression`,Ss=`WhereKindEqual`;function isWhereKindEqual(e){return X.isInstance(e,Ss)}const Cs=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return X.isInstance(e,Cs)}const ws=`WhereRelation`;function isWhereRelation(e){return X.isInstance(e,ws)}const Ts=`WhereRelationExpression`;function isWhereRelationExpression(e){return X.isInstance(e,Ts)}const Es=`WhereTagEqual`;function isWhereTagEqual(e){return X.isInstance(e,Es)}const Ds=`AbstractStep`,Os=`AltSteps`;function isAltSteps(e){return X.isInstance(e,Os)}const ks=`ArrowProperty`;function isArrowProperty(e){return X.isInstance(e,ks)}const As=`BorderProperty`;function isBorderProperty(e){return X.isInstance(e,As)}const js=`CatchBlock`;function isCatchBlock(e){return X.isInstance(e,js)}const Ms=`ColorProperty`;function isColorProperty(e){return X.isInstance(e,Ms)}const Ns=`CustomColor`,Ps=`CustomElementProperties`;function isCustomElementProperties(e){return X.isInstance(e,Ps)}const Fs=`CustomRelationProperties`;function isCustomRelationProperties(e){return X.isInstance(e,Fs)}const Is=`DeployedInstance`;function isDeployedInstance(e){return X.isInstance(e,Is)}const Ls=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return X.isInstance(e,Ls)}const Rs=`DeploymentNode`;function isDeploymentNode(e){return X.isInstance(e,Rs)}const zs=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return X.isInstance(e,zs)}const Bs=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return X.isInstance(e,Bs)}const Vs=`DeploymentRelation`;function isDeploymentRelation(e){return X.isInstance(e,Vs)}const Hs=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return X.isInstance(e,Hs)}const Us=`DeploymentView`;function isDeploymentView(e){return X.isInstance(e,Us)}const Ws=`DeploymentViewBody`;function isDeploymentViewBody(e){return X.isInstance(e,Ws)}const Gs=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return X.isInstance(e,Gs)}const Ks=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return X.isInstance(e,Ks)}const qs=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return X.isInstance(e,qs)}const Js=`DynamicView`;function isDynamicView(e){return X.isInstance(e,Js)}const Ys=`DynamicViewBody`;function isDynamicViewBody(e){return X.isInstance(e,Ys)}const Xs=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return X.isInstance(e,Xs)}const Zs=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return X.isInstance(e,Zs)}const Qs=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return X.isInstance(e,Qs)}const $s=`DynamicViewRef`,ec=`Element`;function isElement(e){return X.isInstance(e,ec)}const tc=`ElementBody`;function isElementBody(e){return X.isInstance(e,tc)}const nc=`ElementKind`;function isElementKind(e){return X.isInstance(e,nc)}const rc=`ElementKindExpression`;function isElementKindExpression(e){return X.isInstance(e,rc)}const ic=`ElementRef`;function isElementRef(e){return X.isInstance(e,ic)}const ac=`ElementStringProperty`;function isElementStringProperty(e){return X.isInstance(e,ac)}const oc=`ElementStyleProperty`;function isElementStyleProperty(e){return X.isInstance(e,oc)}const sc=`ElementTagExpression`;function isElementTagExpression(e){return X.isInstance(e,sc)}const cc=`ElementView`;function isElementView(e){return X.isInstance(e,cc)}const lc=`ElementViewBody`;function isElementViewBody(e){return X.isInstance(e,lc)}const uc=`ElementViewRef`,dc=`Expressions`;function isExpressions(e){return X.isInstance(e,dc)}const fc=`ExtendDeployment`;function isExtendDeployment(e){return X.isInstance(e,fc)}const pc=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return X.isInstance(e,pc)}const mc=`ExtendElement`;function isExtendElement(e){return X.isInstance(e,mc)}const hc=`ExtendElementBody`;function isExtendElementBody(e){return X.isInstance(e,hc)}const gc=`ExtendRelation`;function isExtendRelation(e){return X.isInstance(e,gc)}const _c=`ExtendRelationBody`;function isExtendRelationBody(e){return X.isInstance(e,_c)}const vc=`FinallyBlock`;function isFinallyBlock(e){return X.isInstance(e,vc)}const yc=`FqnExpressions`;function isFqnExpressions(e){return X.isInstance(e,yc)}const bc=`FqnExprWhere`;function isFqnExprWhere(e){return X.isInstance(e,bc)}const xc=`FqnExprWith`;function isFqnExprWith(e){return X.isInstance(e,xc)}const Sc=`FqnRef`;function isFqnRef(e){return X.isInstance(e,Sc)}const Cc=`FqnRefExpr`;function isFqnRefExpr(e){return X.isInstance(e,Cc)}const wc=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return X.isInstance(e,wc)}const Tc=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return X.isInstance(e,Tc)}const Ec=`Globals`;function isGlobals(e){return X.isInstance(e,Ec)}const Dc=`GlobalStyle`;function isGlobalStyle(e){return X.isInstance(e,Dc)}const Oc=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return X.isInstance(e,Oc)}const kc=`GlobalStyleId`,Ac=`HexColor`;function isHexColor(e){return X.isInstance(e,Ac)}const jc=`IconColorProperty`;function isIconColorProperty(e){return X.isInstance(e,jc)}const Mc=`IconPositionProperty`;function isIconPositionProperty(e){return X.isInstance(e,Mc)}const Nc=`IconProperty`;function isIconProperty(e){return X.isInstance(e,Nc)}const Pc=`IconSizeProperty`;function isIconSizeProperty(e){return X.isInstance(e,Pc)}const Fc=`Imported`;function isImported(e){return X.isInstance(e,Fc)}const Ic=`ImportsFromPoject`;function isImportsFromPoject(e){return X.isInstance(e,Ic)}const Lc=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return X.isInstance(e,Lc)}const Rc=`InOutRelationExpr`;function isInOutRelationExpr(e){return X.isInstance(e,Rc)}const zc=`LibIcon`;function isLibIcon(e){return X.isInstance(e,zc)}const Bc=`LikeC4Grammar`;function isLikeC4Grammar(e){return X.isInstance(e,Bc)}const Vc=`LikeC4Lib`;function isLikeC4Lib(e){return X.isInstance(e,Vc)}const Hc=`LineProperty`;function isLineProperty(e){return X.isInstance(e,Hc)}const Uc=`LinkProperty`;function isLinkProperty(e){return X.isInstance(e,Uc)}const Wc=`MarkdownOrString`;function isMarkdownOrString(e){return X.isInstance(e,Wc)}const Gc=`MetadataArray`;function isMetadataArray(e){return X.isInstance(e,Gc)}const Kc=`MetadataAttribute`;function isMetadataAttribute(e){return X.isInstance(e,Kc)}const qc=`MetadataBody`;function isMetadataBody(e){return X.isInstance(e,qc)}const Jc=`Model`;function isModel(e){return X.isInstance(e,Jc)}const Yc=`ModelDeployments`;function isModelDeployments(e){return X.isInstance(e,Yc)}const Xc=`ModelViews`;function isModelViews(e){return X.isInstance(e,Xc)}const Zc=`MultipleProperty`;function isMultipleProperty(e){return X.isInstance(e,Zc)}const Qc=`NavigateToProperty`;function isNavigateToProperty(e){return X.isInstance(e,Qc)}const $c=`NotationProperty`;function isNotationProperty(e){return X.isInstance(e,$c)}const el=`NotesProperty`;function isNotesProperty(e){return X.isInstance(e,el)}const tl=`OpacityProperty`;function isOpacityProperty(e){return X.isInstance(e,tl)}const nl=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return X.isInstance(e,nl)}const rl=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return X.isInstance(e,rl)}const il=`Relation`;function isRelation(e){return X.isInstance(e,il)}const al=`RelationBody`;function isRelationBody(e){return X.isInstance(e,al)}const ol=`RelationExprWhere`;function isRelationExprWhere(e){return X.isInstance(e,ol)}const sl=`RelationExprWith`;function isRelationExprWith(e){return X.isInstance(e,sl)}const cl=`RelationKindDotRef`;function isRelationKindDotRef(e){return X.isInstance(e,cl)}const ll=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return X.isInstance(e,ll)}const ul=`RelationshipKind`;function isRelationshipKind(e){return X.isInstance(e,ul)}const dl=`RelationStringProperty`;function isRelationStringProperty(e){return X.isInstance(e,dl)}const fl=`RelationStyleProperty`;function isRelationStyleProperty(e){return X.isInstance(e,fl)}const pl=`RGBAColor`;function isRGBAColor(e){return X.isInstance(e,pl)}const ml=`ShapeProperty`;function isShapeProperty(e){return X.isInstance(e,ml)}const hl=`ShapeSizeProperty`;function isShapeSizeProperty(e){return X.isInstance(e,hl)}const gl=`SpecificationColor`;function isSpecificationColor(e){return X.isInstance(e,gl)}const _l=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return X.isInstance(e,_l)}const vl=`SpecificationElementKind`;function isSpecificationElementKind(e){return X.isInstance(e,vl)}const yl=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return X.isInstance(e,yl)}const bl=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return X.isInstance(e,bl)}const xl=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return X.isInstance(e,xl)}const Sl=`SpecificationRule`;function isSpecificationRule(e){return X.isInstance(e,Sl)}const Cl=`SpecificationTag`;function isSpecificationTag(e){return X.isInstance(e,Cl)}const wl=`StepsBlock`;function isStepsBlock(e){return X.isInstance(e,wl)}const Tl=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return X.isInstance(e,Tl)}const El=`StrictFqnRef`;function isStrictFqnRef(e){return X.isInstance(e,El)}function isTag(e){return X.isInstance(e,`Tag`)}const Dl=`TagRef`;function isTagRef(e){return X.isInstance(e,Dl)}const Ol=`Tags`;function isTags(e){return X.isInstance(e,Ol)}const kl=`TextSizeProperty`;function isTextSizeProperty(e){return X.isInstance(e,kl)}const Al=`ViewRef`,jl=`ViewRuleAncestors`;function isViewRuleAncestors(e){return X.isInstance(e,jl)}const Ml=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return X.isInstance(e,Ml)}const Nl=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return X.isInstance(e,Nl)}const Pl=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return X.isInstance(e,Pl)}const Fl=`ViewRuleGroup`;function isViewRuleGroup(e){return X.isInstance(e,Fl)}const Il=`ViewRulePredicate`;function isViewRulePredicate(e){return X.isInstance(e,Il)}const Ll=`ViewRuleRank`;function isViewRuleRank(e){return X.isInstance(e,Ll)}const Rl=`ViewRuleStyle`;function isViewRuleStyle(e){return X.isInstance(e,Rl)}const zl=`ViewStringProperty`;function isViewStringProperty(e){return X.isInstance(e,zl)}const Bl=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return X.isInstance(e,Bl)}const Vl=`WhereElementKind`;function isWhereElementKind(e){return X.isInstance(e,Vl)}const Hl=`WhereElementMetadata`;function isWhereElementMetadata(e){return X.isInstance(e,Hl)}const Ul=`WhereElementNegation`;function isWhereElementNegation(e){return X.isInstance(e,Ul)}const Wl=`WhereElementTag`;function isWhereElementTag(e){return X.isInstance(e,Wl)}const Gl=`WhereRelationKind`;function isWhereRelationKind(e){return X.isInstance(e,Gl)}const Kl=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return X.isInstance(e,Kl)}const ql=`WhereRelationNegation`;function isWhereRelationNegation(e){return X.isInstance(e,ql)}const Jl=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return X.isInstance(e,Jl)}const Yl=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return X.isInstance(e,Yl)}const Xl=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return X.isInstance(e,Xl)}const Zl=`WhereRelationTag`;function isWhereRelationTag(e){return X.isInstance(e,Zl)}const Ql=`WildcardExpression`;function isWildcardExpression(e){return X.isInstance(e,Ql)}const $l=`Step`;function isStep(e){return X.isInstance(e,$l)}const eu=`StepSeries`;function isStepSeries(e){return X.isInstance(e,eu)}const tu=`SubflowStep`;function isSubflowStep(e){return X.isInstance(e,tu)}const nu=`TryBlock`;function isTryBlock(e){return X.isInstance(e,nu)}var LikeC4AstReflection=class extends Vn{getAllTypes(){return[Ds,Os,zo,ks,As,js,Bo,Ms,Ns,Ps,Fs,Is,Ls,Vo,Rs,zs,Bs,Ho,Vs,Hs,Us,Ws,Uo,Gs,Ks,qs,Js,Ys,Xs,Zs,Qs,Wo,$s,Go,ec,tc,nc,rc,Ko,ic,ac,oc,sc,cc,lc,uc,qo,dc,fc,pc,mc,hc,Jo,`ExtendElementProperty`,gc,_c,`ExtendRelationProperty`,vc,Yo,Xo,Zo,bc,xc,yc,Sc,Cc,Qo,wc,Tc,Dc,Oc,kc,Ec,Ac,jc,Mc,Nc,Pc,Fc,Ic,Rc,Lc,zc,Bc,Vc,$o,Hc,Uc,Wc,Gc,Kc,qc,es,ts,Jc,Yc,ns,`ModelReferenceable`,Xc,Zc,Qc,$c,el,tl,nl,rl,pl,rs,il,al,as,os,ss,ol,sl,cl,ll,cs,dl,fl,ul,ls,ml,hl,us,gl,_l,vl,yl,bl,xl,Sl,Cl,$l,ds,eu,fs,wl,Tl,El,ps,ms,tu,`Tag`,Dl,Ol,kl,nu,hs,gs,Al,_s,jl,Ml,Nl,Pl,Fl,Il,Ll,Rl,vs,zl,Bl,ys,bs,Vl,Hl,Ul,Wl,xs,Ss,Cs,ws,Ts,Gl,Kl,ql,Jl,Yl,Xl,Zl,Es,Ql]}computeIsSubtype(e,t){switch(e){case Os:case ds:case hs:return this.isSubtype(fs,t);case ks:case Hc:return this.isSubtype(ls,t);case As:case jc:case Mc:case Zc:case tl:case ml:return this.isSubtype(ms,t);case js:case vc:return this.isSubtype(hs,t);case Ms:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case Is:case Rs:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case Bs:case nc:return this.isSubtype(Ho,t);case Us:case Js:case cc:return this.isSubtype($o,t);case Gs:case Ks:case jl:return this.isSubtype(Uo,t);case qs:case Lc:case Rc:case nl:return this.isSubtype(as,t);case Xs:return this.isSubtype(Wo,t);case Zs:case Qs:return this.isSubtype(Go,t);case Wo:case Ko:case Qc:case cs:case ls:case ps:case ms:return this.isSubtype(zo,t);case ec:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelElement`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case rc:case sc:case Cc:case Ql:return this.isSubtype(Yo,t);case ac:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case oc:return this.isSubtype(Ko,t);case fc:case rs:return this.isSubtype(Qo,t);case mc:return this.isSubtype(`ExtendElementOrRelation`,t)||this.isSubtype(`FqnReferenceable`,t);case Jo:case il:return this.isSubtype(ns,t);case gc:return this.isSubtype(Jo,t);case Yo:case bc:return this.isSubtype(Xo,t);case Xo:case xc:return this.isSubtype(Zo,t);case Zo:case ss:return this.isSubtype(qo,t);case Ac:case pl:return this.isSubtype(Bo,t);case Nc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case Pc:case rl:case hl:case kl:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case Fc:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Uc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case Wc:case Gc:return this.isSubtype(ts,t);case Kc:case $c:case el:case yl:case xl:return this.isSubtype(ps,t);case qc:return this.isSubtype(es,t);case es:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case as:case ol:return this.isSubtype(os,t);case os:case sl:return this.isSubtype(ss,t);case ll:case fl:return this.isSubtype(cs,t);case dl:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case $l:case eu:return this.isSubtype(`AbstractStep`,t)||this.isSubtype(`StepOrSeries`,t);case tu:return this.isSubtype(`StepStatement`,t)||this.isSubtype(`StepsBlock`,t);case nu:return this.isSubtype(`StepsBlock`,t)||this.isSubtype(`TryStep`,t);case gs:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case Ml:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Nl:case Fl:case Il:case Ll:return this.isSubtype(_s,t);case Pl:case Rl:return this.isSubtype(vs,t);case vs:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case zl:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case Bl:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case ys:case Ul:return this.isSubtype(bs,t);case bs:case Ts:return this.isSubtype(xs,t);case Vl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Hl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case Wl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case ws:case ql:return this.isSubtype(Ts,t);case Gl:case Jl:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case Kl:case Yl:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case Xl:case Zl:return this.isSubtype(`WhereRelation`,t)||this.isSubtype(`WhereTagEqual`,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractStep:kind`:case`DeploymentRelation:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`Step:kind`:case`StepSeries:kind`:case`WhereRelationKind:value`:return ul;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Ns;case`DeploymentNode:kind`:return Bs;case`DynamicViewGlobalPredicateRef:predicate`:return wc;case`DynamicViewRef:view`:return Js;case`Element:kind`:case`ElementKindExpression:kind`:return nc;case`ElementViewRef:view`:return cc;case`FqnRef:value`:case`StrictFqnRef:value`:return rs;case`IconProperty:libicon`:return zc;case`Imported:imported`:case`StrictFqnElementRef:el`:return ec;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return $o;case`ViewRuleGlobalPredicateRef:predicate`:return Tc;case`ViewRuleGlobalStyle:style`:return kc;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Ho;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Ds:return{name:Ds,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Os:return{name:Os,properties:[{name:`branches`,defaultValue:[]},{name:`title`}]};case ks:return{name:ks,properties:[{name:`key`},{name:`value`}]};case As:return{name:As,properties:[{name:`key`},{name:`value`}]};case js:return{name:js,properties:[{name:`catch`},{name:`title`},{name:`try`}]};case Ms:return{name:Ms,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Ns:return{name:Ns,properties:[{name:`name`}]};case Ps:return{name:Ps,properties:[{name:`props`,defaultValue:[]}]};case Fs:return{name:Fs,properties:[{name:`props`,defaultValue:[]}]};case Is:return{name:Is,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Ls:return{name:Ls,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Rs:return{name:Rs,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case zs:return{name:zs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Bs:return{name:Bs,properties:[{name:`name`}]};case Vs:return{name:Vs,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Hs:return{name:Hs,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Us:return{name:Us,properties:[{name:`body`},{name:`name`}]};case Ws:return{name:Ws,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Gs:return{name:Gs,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Ks:return{name:Ks,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case qs:return{name:qs,properties:[{name:`source`},{name:`target`}]};case Js:return{name:Js,properties:[{name:`body`},{name:`name`}]};case Ys:return{name:Ys,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case Xs:return{name:Xs,properties:[{name:`key`},{name:`value`}]};case Zs:return{name:Zs,properties:[{name:`predicate`}]};case Qs:return{name:Qs,properties:[{name:`exprs`}]};case $s:return{name:$s,properties:[{name:`view`}]};case ec:return{name:ec,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case tc:return{name:tc,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case nc:return{name:nc,properties:[{name:`name`}]};case rc:return{name:rc,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case ic:return{name:ic,properties:[{name:`modelElement`}]};case ac:return{name:ac,properties:[{name:`key`},{name:`value`}]};case oc:return{name:oc,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case sc:return{name:sc,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case cc:return{name:cc,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case lc:return{name:lc,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case uc:return{name:uc,properties:[{name:`view`}]};case dc:return{name:dc,properties:[{name:`prev`},{name:`value`}]};case fc:return{name:fc,properties:[{name:`body`},{name:`deploymentNode`}]};case pc:return{name:pc,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case mc:return{name:mc,properties:[{name:`body`},{name:`element`}]};case hc:return{name:hc,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case gc:return{name:gc,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case _c:return{name:_c,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case vc:return{name:vc,properties:[{name:`finally`},{name:`title`},{name:`tryCatch`}]};case yc:return{name:yc,properties:[{name:`prev`},{name:`value`}]};case bc:return{name:bc,properties:[{name:`subject`},{name:`where`}]};case xc:return{name:xc,properties:[{name:`custom`},{name:`subject`}]};case Sc:return{name:Sc,properties:[{name:`parent`},{name:`value`}]};case Cc:return{name:Cc,properties:[{name:`ref`},{name:`selector`}]};case wc:return{name:wc,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Tc:return{name:Tc,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ec:return{name:Ec,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Dc:return{name:Dc,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Oc:return{name:Oc,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case kc:return{name:kc,properties:[{name:`name`}]};case Ac:return{name:Ac,properties:[{name:`hex`}]};case jc:return{name:jc,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Mc:return{name:Mc,properties:[{name:`key`},{name:`value`}]};case Nc:return{name:Nc,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Pc:return{name:Pc,properties:[{name:`key`},{name:`value`}]};case Fc:return{name:Fc,properties:[{name:`imported`},{name:`prev`}]};case Ic:return{name:Ic,properties:[{name:`imports`},{name:`project`}]};case Lc:return{name:Lc,properties:[{name:`to`}]};case Rc:return{name:Rc,properties:[{name:`inout`}]};case zc:return{name:zc,properties:[{name:`name`}]};case Bc:return{name:Bc,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Vc:return{name:Vc,properties:[{name:`icons`,defaultValue:[]}]};case Hc:return{name:Hc,properties:[{name:`key`},{name:`value`}]};case Uc:return{name:Uc,properties:[{name:`key`},{name:`title`},{name:`value`}]};case Wc:return{name:Wc,properties:[{name:`markdown`},{name:`text`}]};case Gc:return{name:Gc,properties:[{name:`values`,defaultValue:[]}]};case Kc:return{name:Kc,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case qc:return{name:qc,properties:[{name:`props`,defaultValue:[]}]};case Jc:return{name:Jc,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Yc:return{name:Yc,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Xc:return{name:Xc,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Zc:return{name:Zc,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Qc:return{name:Qc,properties:[{name:`key`},{name:`value`}]};case $c:return{name:$c,properties:[{name:`key`},{name:`value`}]};case el:return{name:el,properties:[{name:`key`},{name:`value`}]};case tl:return{name:tl,properties:[{name:`key`},{name:`value`}]};case nl:return{name:nl,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case rl:return{name:rl,properties:[{name:`key`},{name:`value`}]};case il:return{name:il,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case al:return{name:al,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ol:return{name:ol,properties:[{name:`subject`},{name:`where`}]};case sl:return{name:sl,properties:[{name:`custom`},{name:`subject`}]};case cl:return{name:cl,properties:[{name:`kind`}]};case ll:return{name:ll,properties:[{name:`key`},{name:`value`}]};case ul:return{name:ul,properties:[{name:`name`}]};case dl:return{name:dl,properties:[{name:`key`},{name:`value`}]};case fl:return{name:fl,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case pl:return{name:pl,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case ml:return{name:ml,properties:[{name:`key`},{name:`value`}]};case hl:return{name:hl,properties:[{name:`key`},{name:`value`}]};case gl:return{name:gl,properties:[{name:`color`},{name:`name`}]};case _l:return{name:_l,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case vl:return{name:vl,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case yl:return{name:yl,properties:[{name:`key`},{name:`value`}]};case bl:return{name:bl,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case xl:return{name:xl,properties:[{name:`key`},{name:`value`}]};case Sl:return{name:Sl,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case Cl:return{name:Cl,properties:[{name:`color`},{name:`tag`}]};case wl:return{name:wl,properties:[{name:`steps`,defaultValue:[]}]};case Tl:return{name:Tl,properties:[{name:`el`},{name:`parent`}]};case El:return{name:El,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Dl:return{name:Dl,properties:[{name:`tag`}]};case Ol:return{name:Ol,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case kl:return{name:kl,properties:[{name:`key`},{name:`value`}]};case Al:return{name:Al,properties:[{name:`view`}]};case jl:return{name:jl,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Ml:return{name:Ml,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Nl:return{name:Nl,properties:[{name:`predicate`}]};case Pl:return{name:Pl,properties:[{name:`style`}]};case Fl:return{name:Fl,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Il:return{name:Il,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Ll:return{name:Ll,properties:[{name:`targets`},{name:`value`}]};case Rl:return{name:Rl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case zl:return{name:zl,properties:[{name:`key`},{name:`value`}]};case Bl:return{name:Bl,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Vl:return{name:Vl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Hl:return{name:Hl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Ul:return{name:Ul,properties:[{name:`value`}]};case Wl:return{name:Wl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Gl:return{name:Gl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Kl:return{name:Kl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ql:return{name:ql,properties:[{name:`value`}]};case Jl:return{name:Jl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Yl:return{name:Yl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Xl:return{name:Xl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Zl:return{name:Zl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Ql:return{name:Ql,properties:[{name:`isWildcard`,defaultValue:!1}]};case $l:return{name:$l,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case eu:return{name:eu,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case tu:return{name:tu,properties:[{name:`kind`},{name:`steps`,defaultValue:[]},{name:`title`}]};case nu:return{name:nu,properties:[{name:`steps`,defaultValue:[]},{name:`title`}]};default:return{name:e,properties:[]}}}};const X=new LikeC4AstReflection;let ru;const LikeC4Grammar=()=>ru??=Zn(`{"$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@132"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"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@170"},"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@174"},"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@174"},"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@174"},"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@173"},"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@174"},"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@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"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@172"},"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@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"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@167"},"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@167"},"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":"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@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"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":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@197"},"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@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"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@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"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@159"},"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@159"},"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":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelElement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"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@174"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"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@197"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"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@23"},"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@21"},"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@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"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@172"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementOrRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendRelation"}},{"$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@160"},"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@197"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendElement"}},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"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@27"},"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@21"},"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@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"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@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","returnType":{"$ref":"#/interfaces@0"},"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","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@1"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","returnType":{"$ref":"#/interfaces@3"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@3"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"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@160"},"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@197"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"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@89"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"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@172"},"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@158"},"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@174"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","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":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@172"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@197"},"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@82"},"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@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"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@174"},"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@174"},"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":"RuleCall","rule":{"$ref":"#/rules@63"},"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@163"},"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@138"},"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@172"},"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@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"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@103"},"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@197"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepStatement","returnType":{"$ref":"#/types@5"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepsBlockFragment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowStep","returnType":{"$ref":"#/interfaces@5"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"}]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepsBlock","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Represents a block of step statements, i.e. { ... }\\n */"},{"$type":"ParserRule","name":"TryStep","returnType":{"$ref":"#/types@6"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FinallyBlock","returnType":{"$ref":"#/interfaces@8"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@8"},"feature":"tryCatch","operator":"="},{"$type":"Keyword","value":"finally"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"finally","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CatchBlock","returnType":{"$ref":"#/interfaces@7"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@7"},"feature":"try","operator":"="},{"$type":"Keyword","value":"catch"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"catch","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TryBlock","returnType":{"$ref":"#/interfaces@6"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"try"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"AltSteps","returnType":{"$ref":"#/interfaces@9"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"branches","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":"StepTarget","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@197"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepOrSeries","returnType":{"$ref":"#/types@7"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepSeries","returnType":{"$ref":"#/interfaces@12"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@12"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},{"$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":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Step","returnType":{"$ref":"#/interfaces@11"},"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":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},{"$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":"RuleCall","rule":{"$ref":"#/rules@72"},"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@90"},"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@133"},"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@90"},"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@134"},"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@103"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"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@135"},"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@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"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@199"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"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@172"},"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@172"},"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@88"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"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@89"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"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@91"},"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@91"},"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@94"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"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@86"},"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@96"},"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@104"},"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@95"},"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@87"},"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@98"},"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@111"},"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@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"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@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"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@99"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"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@100"},"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@96"},"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@102"},"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@96"},"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@96"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},{"$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@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]}]},"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@96"},"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@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"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@106"},"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@106"},"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@107"},"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@107"},"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@104"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@104"},"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":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@8"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"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@113"},"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@113"},"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@114"},"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@114"},"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@111"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"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@111"},"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":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@8"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}}]}]},"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@118"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"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@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"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@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"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@174"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"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@197"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"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@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"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@123"},"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@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"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@124/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@124/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@160"},"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@197"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"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@125"},"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@174"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"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@128"},"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@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$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":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"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@90"},"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@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"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@200"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@200"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"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@200"},"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@135"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"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@135"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"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@171"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"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@164"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"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@195"},"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@183"},"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@170"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"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@164"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"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@150"},"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@145"},"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@165"},"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@161"},"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@148"},"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@150"},"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@150"},"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@150"},"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@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"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@154"},"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@161"},"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@162"},"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@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"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@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"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@199"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@195"},"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@190"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@201"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"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@185"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@196"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"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@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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"},{"$type":"Keyword","value":"relationship"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DotId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HashId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}]},"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@194"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"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@194"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"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":"DotPrefix","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]|_+[a-zA-Z0-9])[-\\\\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}],"interfaces":[{"$type":"Interface","name":"ElementRef","attributes":[{"$type":"TypeAttribute","name":"modelElement","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnElementRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}}},{"$type":"TypeAttribute","name":"el","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@3"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StepsBlock","attributes":[{"$type":"TypeAttribute","name":"steps","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"SubflowStep","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"kind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","stringType":"opt"},{"$type":"SimpleType","stringType":"par"},{"$type":"SimpleType","stringType":"parallel"},{"$type":"SimpleType","stringType":"loop"},{"$type":"SimpleType","stringType":"when"},{"$type":"SimpleType","stringType":"if"},{"$type":"SimpleType","stringType":"else"},{"$type":"SimpleType","stringType":"break"}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"TryBlock","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"CatchBlock","attributes":[{"$type":"TypeAttribute","name":"try","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"catch","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FinallyBlock","attributes":[{"$type":"TypeAttribute","name":"tryCatch","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"finally","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AltSteps","attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"branches","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AbstractStep","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@160"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"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@87"}}}],"superTypes":[]},{"$type":"Interface","name":"Step","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}],"$comment":"/**\\n * A single step in a dynamic view flow\\n * source -> target\\n */"},{"$type":"Interface","name":"StepSeries","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]},"isOptional":false}],"$comment":"/**\\n * A series of steps in a dynamic view flow\\n * source -> target1 -> target2 -> ...\\n */"}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@118"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$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@126"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$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@84"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@85"}}]}},{"$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@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@158"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@88"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@154"}}]}},{"$type":"Type","name":"StepStatement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/types@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@9"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}]}},{"$type":"Type","name":"TryStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@8"}}]}},{"$type":"Type","name":"StepOrSeries","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]}},{"$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@109/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@5/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@4/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@1/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@3/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@116/definition/elements@0/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@104"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@118"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@25/definition/elements@1/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@151"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@152"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@153"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}}]}}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),iu={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},au={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},ou={AstReflection:()=>new LikeC4AstReflection},su={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>iu,parser:{ParserConfig:()=>au}},cu=Symbol.for(`idattr`),lu={writeId(e,t){return e[cu]=t,e},readId(e){return e[cu]}},uu={writeId(e,t){return N(t)?e[cu]=void 0:e[cu]=t,e},readId(e){return e[cu]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===iu.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:Je(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({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:nonexhaustive(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:nonexhaustive(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let s of e)if(t(s))switch(!0){case isColorProperty(s):{let e=toColor(s);x(e)&&(r.color=e);break}case isLineProperty(s):r.line=s.value;break;case isArrowProperty(s):switch(s.key){case`head`:r.head=s.value;break;case`tail`:r.tail=s.value;break;default:nonexhaustive(s)}break;default:nonexhaustive(s)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,s;switch(e.direction){case`TopBottom`:s=`TB`;break;case`BottomTop`:s=`BT`;break;case`LeftRight`:s=`LR`;break;case`RightLeft`:s=`RL`;break;default:nonexhaustive(e.direction)}return{direction:s,...r&&{nodeSep:r},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:nonexhaustive(e)}}function getViewRulePredicateContainer(e){return Wn(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),du=r(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(du(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(du(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(du(e))return!0;if(e.$container)e=e.$container;else return!1}}function elementRef(e){try{let t=isStrictFqnElementRef(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 readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode(t))return null;if(isDeployedInstance(t))return t;if(N(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(N(e.parent))return!1;e=e.parent}return!1}var IndexManager=class extends hn{services;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,r){let s=this.services.workspace.ProjectsManager;return Nn(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:s.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}},LangiumDocuments=class extends tn{services;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.`);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e));let r=[...this.documentMap.values()],s=r.at(-1);if(!s||compareByUri(s,e)<=0){this.documentMap.set(t,e);return}r.push(e),r.sort(compareByUri),this.documentMap.clear();for(let e of r)this.documentMap.set(e.uri.toString(),e)}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return Nn(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return Nn(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return Nn(this.documentMap.values()).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return k(this.userDocuments.toArray(),w(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),re(D(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},fu=e(jr(),1);const Z=Y.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?Er(e,{acceptRelative:!1,strict:!0})?e:fn.file(e).toString():e.toString()}const pu=compareNaturalHierarchically(`/`,!0),compareUri=(e,t)=>pu(xr(e.path),xr(t.path));function isParentFolderFor(e){return t=>e.startsWith(isString(t)?t:t.folder)}function _overlaps(e,t){let r=isString(e)?e:e.folder,s=isString(t)?t:t.folder;return r===s||r.startsWith(s)||s.startsWith(r)}function overlaps(...e){return ae(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _isInScope(e,t){return t.startsWith(e.folder)||(e.includePaths?.some(isParentFolderFor(t))??!1)}function _excludes(e,t){return e.exclude?.(kr(t))??!1}function includes(...e){return ae(_includes,e)}function isInScope(...e){return ae(_isInScope,e)}function excludes(...e){return ae(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),Dr(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:ye(e,compareProjectByFolder)}const mu={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,fu.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return mu.exclude(kr(e))}function parseRegisterOptions(e){if(`configUri`in e){invariant(!se(e.configUri),`configUri is emptyish`);let t=fn.isUri(e.configUri)?e.configUri:fn.parse(normalizeUri(e.configUri)),r=ProjectFolder(pn.dirname(t));return{configUri:t,folder:r,folderUri:fn.parse(r)}}invariant(!se(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=fn.parse(t);return{configUri:pn.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var hu=class ProjectsManager extends ADisposable{services;static DefaultProjectId=mu.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new P.default(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=pn.joinPath(t,`likec4.config.json`),s=ProjectFolder(t);return{id:e,config:mu.config,folder:s,folderUri:fn.parse(s),configUri:r,exclude:mu.exclude,includeConfig:{...mu.includeConfig}}}return nonNullable(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new P.default(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.findOwnerProject(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:this.#r.some(isInScope(e))?!this.#r.some(includes(e)):isExcludedByDefault(e)});#o=new P.default(e=>this.findOwnerProject(e)??null);constructor(e){super(),this.services=e,this.onDispose(er.create(()=>{this.#e.length=0})),Z.trace`created`}isExcludedByWorkspace(e){return this.#n?(fn.isUri(e)&&(e=normalizeUri(e)),this.#n(kr(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=k(e,M(x),w(e=>(!Ar(e)&&!e.startsWith(`**`)&&(e=Tr(`**`,e)),e)));if(!j(t,1)){this.#n=void 0;return}Z.debug`set workspace exclude patterns: ${t}`,this.#n=(0,fu.default)(t,{dot:!0}),this.clearCaches()}catch(e){Z.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return j(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId){Z.debug`reset default project ID`;return}invariant(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Z.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(j(this.#r,1)){let e=[...w(this.#r,D(`id`)),mu.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[mu.id]}getProject(e){let t=typeof e==`string`?e:this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!je(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(invariant(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):nonNullable(this.defaultProjectId,()=>`Specify exact project, known: [${w(this.#r,D(`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 isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:j(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!this.#a.get(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${mu.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!$t(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=ko.validate(e.config),{configUri:s,folder:c,folderUri:u}=parseRegisterOptions(e),d=ko.normalizeInclude(r.include),p=this.#r.find(e=>e.folder===c);return p?(p.config.name!==r.name&&(Z.info`project name changed from ${p.config.name} to ${r.name}`,Z.info`remove ${p.id}`,p.id=this.uniqueProjectId(r.name),Z.info`add ${p.id}`),this.warnIfConfigOverride(p,s),p.config=r,p.folder=c,p.folderUri=u,p.configUri=s,p.includeConfig=d):(p={id:this.uniqueProjectId(r.name),config:r,folder:c,configUri:s,folderUri:u,includeConfig:d},this.#r=ensureProjectsOrder([...this.#r,p]),Z.info`add ${p.id}`),safeCall(()=>this.updateIncludesExcludes(p)),this.isInitiatingOrReloading?p:(this.clearCaches(),this.notifyListeners(),await this.rebuildProject(p.id,t).catch(e=>$t(e)?Promise.reject(e):(Z.warn(`Failed to rebuild project {projectId} after config change`,{projectId:p.id,error:e}),Promise.resolve())),p)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}findOwnerProject(e){if(this.#r.length===0)return;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??void 0}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?pn.relative(r.folderUri,fn.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Z.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Z.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>($t(e)||Z.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Z.warn(`Failed to reloadProjects, no workspace folders found`);return}Z.debug`start reload projects`;let r=[];for(let e of t){let t=fn.parse(e.uri);Z.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let s of e)Z.debug`found config ${pn.relative(t,s.uri)}`,r.push(s.uri)}catch(e){Z.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Z.warning(`No config files found`);return}Z.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Z.warning(`reset`)}r.sort(compareUri);let s=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Z.warn(loggable(t));let r=s.get(e.toString());r&&(Z.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Z.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.clearCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(w(this.#r,D(`id`))),r=e;if(!t.has(r))return r;Z.warn`Project "${e}" already exists, generating unique ID`;let s=1;for(;t.has(r);)r=`${e}-${s++}`;return r}clearCaches(){Z.trace(`clearCaches`),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(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Z.info`Rebuilding all documents `:Z.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let s=Z.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),c=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(c.length===0){s.trace`no documents found for project ${r.id}, skipping rebuild`;return}s.info`rebuild project documents: ${c.length}`,this.clearCaches(),await this.services.workspace.DocumentBuilder.update(c,[],t).catch(e=>{s.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),er.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 Z.warn(`Failed to get workspace URI, using default folder`,{error:e}),fn.file(`/`)}}notifyListeners(){for(let e of[...this.#e])try{e()}catch(e){Z.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;delete e.includePaths,delete e.exclude;let r=e.includeConfig.paths;j(r,1)&&(e.includePaths=w(r,t=>{let r=pn.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Z.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`);let s=t.exclude;if(N(s)?e.exclude=mu.exclude:j(s,1)&&(e.exclude=(0,fu.default)([e.folderUri,...w(e.includePaths??[],D(`uri`))].flatMap(e=>w(s,t=>(!Sr(t)&&!t.startsWith(`**`)&&(t=Tr(`**`,t)),Or(yr(e.path,t))))),{contains:!0,dot:!0})),!e.includePaths)return e;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Z.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:r.id}),r.includePaths?.forEach(s=>{overlaps(t,s)&&Z.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:r.id,otherIncludePath:s.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,s]=w([e.configUri,t],pn.basename);r!==s&&Z.warn`config ${s} overrides ${r} in folder ${e.folder}`}catch{}}},gu=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:s,message:c,customTimers:u={setTimeout,clearTimeout},signal:d}=t,p,abortHandler,m=new Promise((t,m)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(d?.aborted){m(getAbortedReason(d));return}if(d&&(abortHandler=()=>{m(getAbortedReason(d))},d.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,m),r===1/0)return;let h=new gu;p=u.setTimeout.call(void 0,()=>{if(s){try{t(s())}catch(e){m(e)}return}typeof e.cancel==`function`&&e.cancel(),c===!1?t():c instanceof Error?m(c):(h.message=c??`Promise timed out after ${r} milliseconds`,m(h))},r)}).finally(()=>{m.clear(),abortHandler&&d&&d.removeEventListener(`abort`,abortHandler)});return m.clear=()=>{u.clearTimeout.call(void 0,p),p=void 0},m}var LikeC4WorkspaceManager=class extends En{services;fileSystemProvider;#e=Y.getChild(`workspace`);#t=!1;#n=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.fileSystemProvider=e.workspace.FileSystemProvider}get documentFactory(){return this.services.workspace.LangiumDocumentFactory}get isReady(){return this.#t}async performStartup(e){this.#t&&this.#e.warn`workspace already initialized, invalid performStartup call`;try{this.#t=!1,await this.readExcludeConfig(),this.folders??=e;let t=e.map(e=>fn.parse(e.uri)),r=[],s=[];for(let e of t){this.#e.debug`scanning folder ${e.fsPath} for likec4`;try{let t=await this.fileSystemProvider.scanProjectFiles(e);r.push(...t)}catch(t){this.#e.warn(`Failed to scan workspace folder {folder} for project config files`,{folder:e.fsPath,error:t})}try{s.push(...await this.fileSystemProvider.readDirectory(e,{recursive:!0}))}catch(t){this.#e.warn(`Failed to read workspace folder {folder} for likec4 files`,{folder:e.fsPath,error:t})}this.services.workspace.FileSystemWatcher.watch(e.fsPath)}let c=this.services.workspace.ProjectsManager,u=0;for(let e of r)try{await c.registerConfigFile(e.uri),u++}catch(t){this.#e.warn(`Failed to register config file {config}`,{config:e.uri.fsPath,error:t})}r.length===u?u>0&&this.#e.info`loaded ${u} projects`:this.#e.warn`loaded ${u} projects out of ${r.length}`,u>0&&s.push(...await this.scanProjectIncludePaths());let d=await this.loadDocuments(s);j(d,1)?this.#e.debug`found ${d.length} likec4 documents`:this.#e.warn(`No likec4 documents found in workspace`),d.push(this.documentFactory.fromString(Po,fn.parse(Io)));for(let e of d)this.saveAddDocument(e);return d}finally{this.#t=!0,this._ready.resolve()}}async scanProjectIncludePaths(){let e=this.services.workspace.ProjectsManager.getAllIncludePaths();if(j(e,1))return[];let t=d(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),r=[];for(let{projectId:s,includePath:c,includeConfig:u}of e)try{this.#e.debug`scanning include path ${c.fsPath} for project ${s}`;let e=k(await this.fileSystemProvider.readDirectory(c,{recursive:!0,maxDepth:u.maxDepth}),M(t));r.push(...e),e.length===0?this.#e.trace`no files found in include path ${c.fsPath}`:(this.#e.debug`loaded ${e.length} files from include path ${c.fsPath}`,e.length>u.fileThreshold&&this.#e.warn(`Loaded ${e.length} files from include path ${c.fsPath} (project: ${s}) (threshold: ${u.fileThreshold}).\nLarge include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`))}catch(e){this.#e.warn(`Failed to scan include path ${c.fsPath}`,{error:e})}return r}async loadDocuments(e){let t=k(e,De(e=>e.uri.path),ye(compareByUri)),r=[];for(let e of t)try{r.push(await this.documentFactory.fromUri(e.uri))}catch(t){this.#e.warn(`Failed to load document ${e.uri}`,{error:t})}return r}saveAddDocument(e){this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)}workspace(){return this.folders&&j(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();this.#e.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 invariant(e,`Workspace not initialized`),fn.parse(e.uri)}get workspaceURL(){let e=this.workspace();return invariant(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of[...this.#n])e();this.services.workspace.ProjectsManager.clearCaches(),this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#n.push(e),er.create(()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){this.#e.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{this.#e.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),this.#e.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(this.#e.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):this.#e.trace(`no initial exclude configuration found`)}catch(e){this.#e.warn(`Failed to read initial exclude configuration`,{error:e})}}};function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;invariant(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=Fn(e)?kn(e):e;return t.likec4ProjectId?t.likec4ProjectId:(Y.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,hu.DefaultProjectId)}function stringHash(...e){return stringHash$1(e.length>1?e.join(`:::`):e[0])}function safeCall(e){try{return e()}catch(e){Y.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return vr(performanceNow()-e)}}}const _u=Y.getChild(`manual-layouts`),vu=`.likec4.snap`,isManualLayoutFile=e=>e!==vu&&e.endsWith(vu);function fileName(e){return`${e}${vu}`}function viewIdFromURI(e){let t=pn.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return pn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const yu={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},bu=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=pLimit(1);constructor(e){super(),this.services=e,this.cache=new Qn,this.onDispose(er.create(()=>{this.listeners.length=0,this.cache.clear()})),onNextTick(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}))})}async handleFileSystemUpdate(e){let t=e.update??e.delete,r=viewIdFromURI(t)??void 0,s=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(s),`delete`in e){this.triggerUpdate(exact({removed:t,projectId:s,viewId:r}));return}let c=this.services.workspace.ProjectsManager.getProject(s);if(!r){let e=await this.readSnapshot(t,c);e?r=e.id:(_u.error(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate({updated:t,projectId:s,viewId:r})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=_u.getChild(e.id),r=this.services.workspace.FileSystemProvider,s=getManualLayoutsOutDir(e),c=[],u=`${s.toString()}`;try{let d=await r.scanDirectory(s,isManualLayoutFile);if(d.length===0)return null;d.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let s of d)try{let t=await r.readFile(s.uri),d=mi.parse(t);u=stringHash$1(u+s.uri.toString()+t);let p=this.resolveIconPathsAfterRead(d,e.folderUri);c.push({...p,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${s.uri.fsPath}`,{err:e})}c.length&&t.trace`read manual layouts for ${e.id}, found ${c.length}`}catch(r){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:r})}if(c.length===0)return null;let d=b(c,D(`id`));return{hash:u,views:d}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let s=await r.readFile(e),c=mi.parse(s);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(c,t.folderUri),_layout:`manual`}}catch(t){return _u.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return _u.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){this.cache.delete(e.id);let r=_u.getChild(e.id),s=getManualLayoutsOutDir(e),c=pn.joinPath(s,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let u=mi.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),d={uri:c.toString(),range:dn.create(ln.create(0,0),ln.create(u.split(`
73
73
  `).length-1,1))};r.debug`write snapshot of ${t.id} in project ${e.id} to ${c.fsPath}`;let p=this.services.workspace.FileSystemProvider;try{await p.writeFile(c,u+`
74
- `),this.triggerUpdate({updated:c,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot ${t.id} to ${c.fsPath}`,{err:e})}return d}async remove(e,t){this.cache.delete(e.id);let r=$l.getChild(e.id),s=getManualLayoutsOutDir(e),c=cn.joinPath(s,fileName(t));r.debug`delete snapshot of ${t} in project ${e.id}. File: ${c.fsPath}`;let u={uri:c.toString(),range:Hn.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(c))return r.warn`Snapshot ${t} did not exist at ${c.fsPath}`,null;this.triggerUpdate({removed:c,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot ${t} from ${c.fsPath}`,{err:e})}return u}clearCaches(){$l.trace`clear caches`,this.cache.clear()}triggerUpdate(e){let t=[...this.listeners];for(let r of t)safeCall(()=>r(e))}normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=R.parse(e.icon),s=cn.relative(t,r);return s.startsWith(`..`)?e:{...e,icon:`${nu}${s}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(nu)){let r=e.icon.substring(9),s=cn.joinPath(t,r);return{...e,icon:s.toString()}}return e});return{...e,nodes:r}}};const ru=Y.getChild(`chokidar`),iu={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=ni(e);return hasLikeC4Ext(t)||isLikeC4Config(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;queue=new It({concurrency:1,timeout:5e3});constructor(e){this.services=e,ru.debug`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){ru.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;try{await e.close()}catch{}}}createWatcher(e){ru.debug`create watcher for folder: ${e}`;let t=Er.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!isAnyLikeC4File(e)],followSymlinks:!0,ignoreInitial:!0}),onAddOrChange=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},onRemove=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,onAddOrChange).on(`change`,onAddOrChange).on(`unlink`,onRemove).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){ru.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{ru.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,r=ni(e),s=R.file(e);switch(!0){case isLikeC4Config(r):ru.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(s);break;case isManualLayoutFile(r):ru.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:s});break;case hasLikeC4Ext(r):ru.debug`file changed: ${e}`,await t.DocumentBuilder.update([s],[]);break;default:ru.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,r=ni(e),s=R.file(e);switch(!0){case isLikeC4Config(r):ru.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(r):ru.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[s]);break;case isManualLayoutFile(r):ru.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:s});break;default:ru.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){ru.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(So);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.`)}},NoopFileSystemWatcher=class{constructor(){Y.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){Y.debug`NoopLikeC4ManualLayouts created`}handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const au={fileSystemWatcher:()=>new NoopFileSystemWatcher},ou={fileSystemProvider:()=>new NoopFileSystemProvider,...au},su={manualLayouts:()=>new NoopLikeC4ManualLayouts},cu=Y.getChild(`filesystem`);function isLikeC4ConfigFile(e,t=!1){return!t&&isLikeC4Config(ni(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(ni(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:()=>new SymLinkTraversingFileSystemProvider,...e?iu:au});var SymLinkTraversingFileSystemProvider=class extends zn{async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(So);try{return await super.readFile(e)}catch(t){return cu.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let r=t?.recursive??!0,s=t?.maxDepth??1/0,c=[];try{let t=new Ql.fdir().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(isLikeC4File);r?s!==1/0&&(t=t.withMaxDepth(s)):t=t.withMaxDepth(1);let u=await t.crawl(e.fsPath).withPromise();for(let e of u)c.push({isFile:!0,isDirectory:!1,uri:R.file(e)})}catch(t){cu.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return c.sort(ensureOrder)}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);if(t.length<=1)return t;let r=compareNaturalHierarchically(`/`,!0),compareByPath=(e,t)=>r(e.uri.path,t.uri.path);return t.sort(compareByPath)}async scanDirectory(e,t){let r=[];try{let s=await new Ql.fdir().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of s)r.push({isFile:!0,isDirectory:!1,uri:R.file(e)})}catch(t){cu.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=ri(e.fsPath),s=pi(r,{throwIfNoEntry:!1});if(s?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return s||(cu.debug(`creating directory {path}`,{path:r}),fi(r,{recursive:!0})),cu.debug(`writing file {path}`,{path:e.fsPath}),await ui(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=pi(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await li(t),cu.debug(`deleted file {path}`,{path:t}),!0):(cu.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){cu.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends tr{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!isDeploymentNode(e)&&!isDeployedInstance(e)&&!isElement(e))return super.getDocumentation(e);try{let t=un(e);if(t.state<Kt.Linked)return super.getDocumentation(e);let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode(e):{let t=r.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let s=r.parseDeployedInstance(e);if(!s)return;let[c,u]=G.isImportRef(s.element)?[s.element.project,s.element.model]:[t.likec4ProjectId,s.element.model],d=c?this.locator.getParsedElement(u,c):this.locator.getParsedElement(u),p=[`_instance of_ \`${u}\``];return d&&p.push(`**${d.element.title}**`),p.join(`
74
+ `),this.triggerUpdate({updated:c,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot ${t.id} to ${c.fsPath}`,{err:e})}return d}async remove(e,t){this.cache.delete(e.id);let r=_u.getChild(e.id),s=getManualLayoutsOutDir(e),c=pn.joinPath(s,fileName(t));r.debug`delete snapshot of ${t} in project ${e.id}. File: ${c.fsPath}`;let u={uri:c.toString(),range:dn.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(c))return r.warn`Snapshot ${t} did not exist at ${c.fsPath}`,null;this.triggerUpdate({removed:c,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot ${t} from ${c.fsPath}`,{err:e})}return u}clearCaches(){_u.trace`clear caches`,this.cache.clear()}triggerUpdate(e){let t=[...this.listeners];for(let r of t)safeCall(()=>r(e))}normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=fn.parse(e.icon),s=pn.relative(t,r);return s.startsWith(`..`)?e:{...e,icon:`${bu}${s}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(bu)){let r=e.icon.substring(9),s=pn.joinPath(t,r);return{...e,icon:s.toString()}}return e});return{...e,nodes:r}}};function hasLikeC4Ext(e){return iu.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const xu=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return xu.includes(e)}function insideNodeModulesOrRepo(e){for(let t of xu)if(e.includes(t))return!0;return!1}const Su=Y.getChild(`chokidar`),Cu={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=Yr(e);return hasLikeC4Ext(t)||isLikeC4Config(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;queue=new Rt({concurrency:1,timeout:5e3});constructor(e){this.services=e,Su.trace`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){Su.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;try{await e.close()}catch{}}}createWatcher(e){Su.debug`create watcher for folder: ${e}`;let t=Mr.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!isAnyLikeC4File(e),e=>this.services.workspace.ProjectsManager.isExcluded(fn.file(e))],followSymlinks:!0,ignoreInitial:!0}),onAddOrChange=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},onRemove=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,onAddOrChange).on(`change`,onAddOrChange).on(`unlink`,onRemove).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){Su.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Su.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,r=Yr(e),s=fn.file(e);switch(!0){case isLikeC4Config(r):Su.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(s);break;case isManualLayoutFile(r):Su.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:s});break;case hasLikeC4Ext(r):Su.debug`file changed: ${e}`,await t.DocumentBuilder.update([s],[]);break;default:Su.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,r=Yr(e),s=fn.file(e);switch(!0){case isLikeC4Config(r):Su.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(r):Su.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[s]);break;case isManualLayoutFile(r):Su.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:s});break;default:Su.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Su.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Po);throw Error(`No file system is available (${e.toString()})`)}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.`)}},NoopFileSystemWatcher=class{constructor(){Y.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){Y.debug`NoopLikeC4ManualLayouts created`}handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const wu={fileSystemWatcher:()=>new NoopFileSystemWatcher},Tu={fileSystemProvider:()=>new NoopFileSystemProvider,...wu},Eu={manualLayouts:()=>new NoopLikeC4ManualLayouts};function isLikeC4ConfigFile(e,t=!1){return!t&&isLikeC4Config(Yr(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(Yr(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:()=>new SymLinkTraversingFileSystemProvider,...e?Cu:wu});var SymLinkTraversingFileSystemProvider=class extends Rn{#e=Y.getChild(`filesystem`);async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Po);try{return await super.readFile(e)}catch(t){return this.#e.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let r=t?.recursive??!0,s=t?.maxDepth??1/0,c=[];try{let t=new _i().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(isLikeC4File);r?s!==1/0&&(t=t.withMaxDepth(s)):t=t.withMaxDepth(1);let u=await t.crawl(e.fsPath).withPromise();for(let e of u)c.push({isFile:!0,isDirectory:!1,uri:fn.file(e)});return c.sort(compareByUri)}catch(t){return this.#e.warn(`Failed to read directory ${e.fsPath}`,{error:t}),[]}}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);return t.length<=1?t:t.sort(compareByUriDeepFirst)}async scanDirectory(e,t){let r=[];try{let s=await new _i().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of s)r.push({isFile:!0,isDirectory:!1,uri:fn.file(e)})}catch(t){this.#e.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=Xr(e.fsPath),s=yi(r,{throwIfNoEntry:!1});if(s?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return s||(this.#e.debug(`creating directory {path}`,{path:r}),vi(r,{recursive:!0})),this.#e.debug(`writing file {path}`,{path:e.fsPath}),await ii(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=yi(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await ri(t),this.#e.debug(`deleted file {path}`,{path:t}),!0):(this.#e.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){this.#e.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends vn{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!isDeploymentNode(e)&&!isDeployedInstance(e)&&!isElement(e))return super.getDocumentation(e);try{let t=kn(e);if(t.state<rn.Linked)return super.getDocumentation(e);let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode(e):{let t=r.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let s=r.parseDeployedInstance(e);if(!s)return;let[c,u]=G.isImportRef(s.element)?[s.element.project,s.element.model]:[t.likec4ProjectId,s.element.model],d=c?this.locator.getParsedElement(u,c):this.locator.getParsedElement(u),p=[`_instance of_ \`${u}\``];return d&&p.push(`**${d.element.title}**`),p.join(`
75
75
  `)}case isElement(e):{let t=r.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
76
- `):void 0}default:return e}}catch(e){logWarnError(e)}}},lu=yn(),uu=qn();function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(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 isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}const Q={newLine:vn.newLine({allowMore:!0}),oneSpace:vn.oneSpace(),noSpace:vn.noSpace(),indent:vn.indent({allowMore:!0}),noIndent:vn.noIndent()};var LikeC4Formatter=class extends Kn{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let s=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(s),s}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,isTags,(e,t)=>{let r=Xt(e.$cstNode,`values`).filter(T).slice(1);t.cst(r).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...F([e.target,e.tags],T)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...F([e.target,e.tags],T)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,isDynamicViewStep,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(isDynamicStepChain(e)&&isMultiline(e.$cstNode)||isDynamicStepSingle(e)&&isDynamicStepChain(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(vn.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(vn.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isDynamicViewParallelSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(Q.noIndent).prepend(Q.oneSpace);let s=isMultiline(e.$cstNode),c=t.keywords(`}`),u=t.interior(r,c),d=null;for(let e of u.nodes){if(!s){t.cst([e]).surround(Q.oneSpace);continue}(!d||!areOverlap(d,e))&&t.cst([e]).prepend(vn.newLine({allowMore:!0})).prepend(Q.indent),d=e}s?c.prepend(Q.noIndent).prepend(vn.newLine({allowMore:!0})):c.prepend(vn.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,isElementView,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,isDynamicView)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,isDeploymentView)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),s=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);r.nodes.length===0?s.append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=qt(e.$cstNode,`kind`),s=qt(e.$cstNode,`name`);s&&r&&(compareRanges(s,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([s]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElement,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode,(e,t)=>{let r=qt(e.$cstNode,`kind`),s=qt(e.$cstNode,`name`);s&&r&&(compareRanges(s,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([s]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),s=r?.$cstNode&&isMultiline(r?.$cstNode);s&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(s?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let s=t(e)?this.getNodeFormatter(e):void 0;return r&&s&&r(e,s),s}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:nonexhaustive(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isDynamicViewStep)?.properties(`title`),t??=this.on(e,isDeploymentNode)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.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,r)=>{let s=t===`single`?`"`:`'`,c=t===`single`?`'`:`"`,u=c.repeat(3),d=c,p=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?u:d;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),s,c)+t}});r.push(...p)}}escapeQuotesInternalQuotes(e,t,r){let s=``,c=0;for(;c>=0;){let t=e.indexOf(r,c);if(t<0){s+=e.slice(c);break}s+=e.slice(c,t),c=t+1;let u=!1;for(;t>0&&e[t-1]==`\\`;)u=!u,t--;s+=u?r:`\\${r}`}return s}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 ancestorsOfNode(e,t){let r=[],s=e.parent;for(;s;){let e=nonNullable(t.get(s),`Parent node ${s} not found`);r.push(e),s=e.parent}return r}function linkNodesWithEdges(e,t){for(let r of t){let t=e.get(r.source),s=e.get(r.target);invariant(t,`Source node ${r.source} not found`),invariant(s,`Target node ${r.target} not found`),t.outEdges.push(r.id),s.inEdges.push(r.id);let c=ancestorsOfNode(t,e),u=ancestorsOfNode(s,e),d=c.length>0&&u.length>0?Te(commonHead(ge(c),ge(u))):null;r.parent=d?d.id:null;for(let e of c){if(e===d)break;e.outEdges.push(r.id)}for(let e of u){if(e===d)break;e.inEdges.push(r.id)}}}function elementExprToPredicate(e){if(q.isCustom(e))return elementExprToPredicate(e.custom.expr);if(q.isWhere(e)){let t=elementExprToPredicate(e.where.expr),r=whereOperatorAsPredicate(e.where.condition);return e=>t(e)&&r(e)}if(q.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(q.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(q.isWildcard(e))return()=>!0;if(q.isModelRef(e)){let t=G.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||parentFqn(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}nonexhaustive(e)}function createRelationExpressionToPredicates(e){return function relationExpressionToPredicates(t){switch(!0){case Wi.isCustom(t):return relationExpressionToPredicates(t.customRelation.expr);case Wi.isWhere(t):{let e=relationExpressionToPredicates(t.where.expr),r=whereOperatorAsPredicate(t.where.condition);return t=>e(t)&&r({source:{tags:t.source.tags,kind:t.source.kind,metadata:t.source.metadata},target:{tags:t.target.tags,kind:t.target.kind,metadata:t.target.metadata},...t.tags&&{tags:t.tags},...t.kind&&{kind:t.kind},...t.metadata&&{metadata:t.metadata}})}case Wi.isDirect(t):{let r=e(t.source),s=e(t.target);return e=>r(e.source)&&s(e.target)||!!t.isBidirectional&&r(e.target)&&s(e.source)}case Wi.isInOut(t):{let r=e(t.inout);return e=>r(e.source)||r(e.target)}case Wi.isIncoming(t):{let r=e(t.incoming);return e=>r(e.target)}case Wi.isOutgoing(t):{let r=e(t.outgoing);return e=>r(e.source)}default:nonexhaustive(t)}}}const du=createRelationExpressionToPredicates(elementExprToPredicate);function ensureParentsFirst(e){let t=[],r=[...e],s;for(;s=r.shift();){let e=s.parent;if(e){let s=[];for(;e;){let t=r.findIndex(t=>t.id===e);if(t<0)break;let[c]=r.splice(t,1);if(!c)throw Error(`Invalid state, should not happen`);s.unshift(c),e=c.parent}t.push(...s)}t.push(s)}return t}function updateChildren(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,r)=>(r.parent===t.id&&e.push(r.id),e),[]))}),e}function topologicalSort$1(e){let t=ensureParentsFirst([...e.nodes.values()]),r=[...e.edges];if(t.length<2||r.length===0)return{nodes:t,edges:r};let getNode=t=>nonNullable(e.nodes.get(t)),s=new Ft({multi:!0,allowSelfLoops:!0,type:`directed`}),[c,u]=Ge(N(r,D(e=>{let t=getNode(e.source),r=getNode(e.target),s=e.parent?getNode(e.parent):null;return{id:e.id,edge:e,parent:s,source:t,target:r}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),d=[],addEdgeToGraph=e=>{s.mergeNode(e.source),s.mergeNode(e.target),d.push(e),(0,ha.default)(s,e.source,e.target)||s.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:r,target:u}of c)if(addEdgeToGraph(t),u.parent&&u.parent!==t.parent&&N(ancestorsOfNode(u,e.nodes),Le(e=>e.inEdges.includes(t.id)),he(e=>{s.mergeNode(e.id),(0,ha.default)(s,t.source,e.id)||s.mergeDirectedEdge(t.source,e.id),(0,ha.default)(s,e.id,t.target)||s.mergeDirectedEdge(e.id,t.target)})),r.parent){let e=getNode(r.parent);s.mergeNode(e.id),(0,ha.default)(s,e.id,r.id)||s.mergeDirectedEdge(e.id,r.id),u.parent&&u.parent!==r.parent&&((0,ha.default)(s,e.id,u.parent)||s.mergeDirectedEdge(e.id,u.parent))}for(let{edge:e}of u)addEdgeToGraph(e);invariant(d.length===r.length,`Not all edges were added to the graph`);let p=(0,ma.topologicalSort)(s),m=[],h=t.slice();for(let e of p){let t=h.findIndex(t=>t.id===e);invariant(t>=0,`Node "${e}" not found`),m.push(...h.splice(t,1))}return h.length>0&&m.length>0&&(m=m.flatMap(e=>{if(h.length===0)return e;let r=t.slice(0,t.indexOf(e)).filter(e=>h.includes(e));return r.length>0?(h=h.filter(e=>!r.includes(e)),[...r,e]):e})),m.push(...h),{nodes:updateChildren(ensureParentsFirst(m)),edges:d}}t(topologicalSort$1,`topologicalSort`);function calcViewLayoutHash(e){return e.hash=objectHash({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:N(e.nodes,D(e=>({id:e.id,icon:T(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:flattenMarkdownOrString(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconColor:e.style.iconColor??null,iconPosition:e.style.iconPosition??null,border:e.style.border??null,opacity:e.style.opacity??null,multiple:e.style.multiple??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),h(({id:e,...t})=>[e,t])),edges:N(e.edges,D(e=>({id:e.id,source:e.source,target:e.target,label:e.label,description:flattenMarkdownOrString(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),h(e=>[e.id,{...e}]))}),e}var AbstractMemory=class{state;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}},AbstractStageExclude=class{memory;expression;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(isIterable(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(v(t)&&(invariant(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),isIterable(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=difference(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=intersection(t,e.elements),t=N(t,ifilter(t=>e.explicits.has(t)&&!isome(e.final,isDescendantOf(t))),toSet()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=difference(e.explicits,t),e.final=difference(e.final,t)),e}removeElements(e){return e.elements=difference(e.elements,this.excluded.elements),e.explicits=difference(e.explicits,this.excluded.elements),e.final=difference(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let r=e.get(t.id);return r?e.set(t.id,r.mergeWith(t)):e.set(t.id,t),e},new Map),r=new Set;e.connections=e.connections.reduce((e,s)=>{let c=t.get(s.id);if(c){r.add(s.source),r.add(s.target);let t=s.difference(c);t.nonEmpty()&&e.push(t)}else e.push(s);return e},[]);for(let t of e.connections)r.delete(t.source),r.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&r.delete(t.boundary);return r.size===0?e:(r=difference(r,e.explicits),e.final=difference(e.final,r),e)}precommit(e){return e}postcommit(e){return invariant(difference(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),invariant(difference(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,...findAscendingConnections(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))}},AbstractStageInclude=class{memory;expression;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 mergeConnections([...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(isIterable(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(isIterable(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(isIterable(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[r,s]=Ge(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(mergeConnections([...e.connections,...r,...s])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=union(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=intersection(e.elements,union(e.explicits,this.explicits)),e.final=intersection(e.elements,union(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function treeFromMemoryState(e,t=`final`){let r=sortParentsFirst(toArray(t===`final`?e.final:e.elements)),s=new Set(e.connections.flatMap(e=>[e.source,e.target])),c=new Set(r),u=new L.default(()=>null),d=r.reduce((e,t,r,s)=>(e.set(t,s.slice(r+1).filter(e=>isAncestor(t,e)).map(e=>(c.delete(e),e)).reduce((e,r)=>(e.some(e=>isAncestor(e,r))||(e.push(r),u.set(r,t)),e),[])),e),new L.default(()=>[]));return{root:c,connected:s,hasInOut:t=>e.connections.some(Da.isAnyInOut(t.id)),parent:e=>u.get(e),children:e=>d.get(e)}}var StageExclude$1=class extends AbstractStageExclude{static{t(this,`StageExclude`)}};function applyViewRuleStyle(e,t,r){let{shape:s,color:c,icon:u,...d}=e.style,p=!j(d);N(r,F(qe(isGroupElementKind)),F(t),he(t=>{t.shape=s??t.shape,t.color=c??t.color,ie(u)&&(t.icon=u),ie(e.notation)&&(t.notation=e.notation),p&&(t.style={...t.style,...d})}))}function applyViewRuleStyles(e,t){for(let r of e)!isViewRuleStyle$1(r)||r.targets.length===0||applyViewRuleStyle(r,ye(r.targets.map(elementExprToPredicate)),t);return t}var fu=class NodesGroup{id;viewRule;parent;elements;static kind=Vi;constructor(e,t,r=null,s=new Set){this.id=e,this.viewRule=t,this.parent=r,this.elements=s}isEmpty(){return this.elements.size===0}update(e){return new NodesGroup(this.id,this.viewRule,this.parent,e)}clone(){return new NodesGroup(this.id,this.viewRule,this.parent,new Set(this.elements))}},StageExclude=class extends AbstractStageExclude{excludeRelations(e){return N(this.memory.connections,F(t=>hasIntersection(t.relations,e)),he(t=>{this.excludeConnections(t.update(intersection(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=difference(this.memory.explicits,e.explicits);for(let r of t)e.explicitFirstSeenIn.delete(r);let r=difference(this.memory.elements,e.elements);for(let t of r)e.lastSeenIn.delete(t);return e}},ActiveGroupStageExclude=class extends StageExclude{memory;expression;constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:pu,findConnectionsBetween:mu}=Ma;var StageInclude$1=class extends AbstractStageInclude{static{t(this,`StageInclude`)}connectWithExisting(e,t=`both`){let r=this._connections.length,hasChanged=()=>this._connections.length>r;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(pu(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(mu(e,this.memory.elements,`directed`)),hasChanged()}let s=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(mu(e,s,`directed`));if(t===`out`||t===`both`)for(let e of s)this.addConnections(mu(e,this.memory.elements,`directed`));return hasChanged()}addImplicitWithinScope(e){e&&(!this.memory.scope||isAncestor(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return Gi.isRelationExpr(this.expression)||N(e,he(({source:e,target:t,boundary:r})=>{N(ze([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),pe(([e,t])=>e===t),fe(1),he(([s,c])=>{if(s===e&&c===t){this.addImplicitWithinScope(r);return}s!==e&&this.addImplicitWithinScope(s),c!==t&&this.addImplicitWithinScope(c)}))})),e}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let r of t)e.explicitFirstSeenIn.set(r,`@root`);return e}},ActiveGroupStageInclude=class extends StageInclude$1{memory;expression;constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let r of t)e.explicitFirstSeenIn.set(r,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},hu=class Memory$1 extends AbstractMemory{static{t(this,`Memory`)}state;scope;static empty(e){return new Memory$1({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},e)}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 StageInclude$1(this,e)}stageExclude(e){return new StageExclude(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(e){return new Memory$1({...this.state,...e},this.scope)}},gu=class ActiveGroupMemory extends hu{state;scope;stack;static enter(e,t){let r=`@gr${e.groups.length+1}`;if(e instanceof ActiveGroupMemory){let s=et.default.from([...e.stack].reverse()),c=e.mutableState();return c.groups.push(new fu(r,t,e.activeGroupId)),s.push(r),new ActiveGroupMemory(c,e.scope,s)}let s=e.mutableState();s.groups.push(new fu(r,t,null));let c=et.default.of(r);return new ActiveGroupMemory(s,e.scope,c)}constructor(e,t,r){super(e,t),this.state=e,this.scope=t,this.stack=r}get activeGroupId(){return nonNullable(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(e){return new ActiveGroupMemory({...this.state,...e},this.scope,this.stack)}stageInclude(e){return new ActiveGroupStageInclude(this,e)}stageExclude(e){return new ActiveGroupStageExclude(this,e)}leave(){let e=this.mutableState();return this.stack.pop(),this.stack.peek()?new ActiveGroupMemory(e,this.scope,this.stack):new hu(e,this.scope)}};function updateDepthOfAncestors(e,t){let r;for(;e.parent&&(r=t.get(e.parent));){let t=r.depth??1;if(r.depth=Math.max(t,(e.depth??0)+1),r.depth===t)break;e=r}}function elementModelToNodeSource(e){let{id:t,title:r,...s}=ne(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:c,icon:u,shape:d,...p}=e.style;return exact({id:t,title:r,modelRef:t,shape:d,color:c,icon:u,style:p,description:preferSummary(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...s})}function buildComputedNodes({defaults:e},t,r){let s=new Map,c=new Map;r?.forEach(({id:t,parent:r,viewRule:u,elements:d})=>{r&&nonNullable(s.get(r),`Parent group node ${r} not found`).children.push(t),s.set(t,{id:t,parent:r,kind:Vi,title:u.title??``,color:u.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:exact({border:u.border??e.group.border,opacity:u.opacity??e.group.opacity,size:u.size,multiple:u.multiple,padding:u.padding,textSize:u.textSize})});for(let e of d)c.set(e.id,t)}),Array.from(t).sort(compareByFqnHierarchically).forEach(({id:e,...t})=>{let r=parentFqn(e),u=0,d;for(;r&&(d=s.get(r),!d);)r=parentFqn(r);let p=t.modelRef??e;if(!d&&c.has(p)){let e=nonNullable(c.get(p));d=s.get(e),r=e}d&&(d.children.length==0&&(d.depth=1,updateDepthOfAncestors(d,s)),d.children.push(e),u=d.level+1);let m=exact({id:e,parent:r,level:u,children:[],inEdges:[],outEdges:[],...t});s.set(e,m)});let u=new Map;return r?.forEach(({id:e})=>{u.set(e,nonNullable(s.get(e)))}),t.forEach(({id:e})=>{u.set(e,nonNullable(s.get(e)))}),u}function pickRelationshipProps(e){let{title:t,description:r=null}=e;return{...t&&{title:t,description:r},...de(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function mergePropsFromRelationships(e,t){let r=N(e,Me((e,t)=>(T(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),T(t.description)&&!e.description.some(oe(t.description))&&e.description.push(t.description),T(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),T(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),T(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),T(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),T(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),T(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),T(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:[]})),s=A(r.title)??(r.title.length>1?`[...]`:void 0),c=le(r.tags),u=exact({title:s,description:A(r.description),technology:A(r.technology),kind:A(r.kind),head:A(r.head),tail:A(r.tail),color:A(r.color),line:A(r.line),navigateTo:A(r.navigateTo),...isNonEmptyArray(c)&&{tags:c}});if(t){let e=pickRelationshipProps(t);u=Ke({...u,...e},T)}return k(u.title)&&T(u.technology)&&(u.title=`[${u.technology}]`,delete u.technology),u}const{findConnection:_u,findConnectionsBetween:vu,findConnectionsWithin:yu}=ja;function resolveElements$1(e,t){let r=e.element(t.ref.deployment);if(r.isDeploymentNode()){if(t.selector===`children`)return[...r.children()];if(t.selector===`expanded`)return[r,...r.children()];if(t.selector===`descendants`)return[...r.descendants()]}return[r]}t(resolveElements$1,`resolveElements`);function resolveModelElements(e,t){let r=e.$model.element(t.ref.model);return t.selector===`children`?[...r.children()]:t.selector===`expanded`?[r,...r.children()]:t.selector===`descendants`?[...r.descendants()]:[r]}function deploymentExpressionToPredicate(e){if(K.isWildcard(e))return()=>!0;if(K.isElementTagExpr(e)||K.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(K.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return r=>r.id===t||r.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>parentFqn(e.id)===t:e=>e.id===t}if(K.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return r=>{let s=r.modelRef??null;return s?s===t||s.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let r=t.modelRef??null;return r?r.startsWith(e):!0}}return e.selector===`children`?e=>{let r=e.modelRef??null;return r?parentFqn(r)===t:!0}:e=>{let r=e.modelRef??null;return r?r===t:!0}}nonexhaustive(e)}function instanceSummary(e){return preferSummary(e.$instance)??preferSummary(e.element.$element)}function deploymentNodeToNodeSource(e){let t=e.id,r=e.onlyOneInstance();return exact({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:P(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:r?.element.id,icon:e.style.icon,description:preferSummary(e.$node)??void 0,tags:[...e.tags],style:ne(e.style,[`icon`,`shape`,`color`])})}function instanceToNodeSource(e){let t=e.$instance,r=e.element,{icon:s,color:c,shape:u,...d}=e.style,p=[...r.links,...t.links??[]];return exact({id:e.id,kind:`instance`,title:e.title,description:instanceSummary(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:P(p,1)?p:void 0,icon:s,color:c,shape:u,style:d,deploymentRef:t.id,modelRef:r.id,notation:t.notation})}function toNodeSource(e){return e.isInstance()?instanceToNodeSource(e):deploymentNodeToNodeSource(e)}const bu=t((e,t,r)=>stringHash$1(`model:${e}:${t}:${r}`),`hashEdgeId`);function mergeBidirectionalEdges(e){let t=new Set;for(let r=0;r<e.length;r++){if(t.has(r))continue;let s=e[r];for(let c=r+1;c<e.length;c++){if(t.has(c))continue;let r=e[c];if(s.source===r.target&&s.target===r.source&&s.label===r.label){s.dir=`both`;let e=s.head??r.head;e&&(s.head||=e,s.tail||=e),r.color&&(s.color||=r.color),r.line&&(s.line||=r.line),t.add(c);break}}}return t.size>0?e.filter((e,r)=>!t.has(r)):e}function toComputedEdges$1(e,t){let r=[],s=[];for(let c of e){let e=[...c.relations.model,...c.relations.deployment];invariant(P(e,1),`Edge must have at least one relation`);let u=c.source.$model.$styles.defaults,d=c.source.id,p=c.target.id;if(t&&e.length>1){let[m,h]=N(e,Ge(e=>t(e,c)));if(m.length>0){for(let e of m){let{title:t,color:s=u.relationship.color,line:m=u.relationship.line,head:h=u.relationship.arrow,...g}=mergePropsFromRelationships([e.$relationship],e.$relationship);r.push({id:bu(d,p,e.id),parent:c.boundary?.id??null,source:d,target:p,label:t??null,relations:[e.id],color:s,line:m,head:h,...g})}if(h.length>0){let e=A(F(h,e=>e.source.id===d&&e.target.id===p)),{title:t,color:r=u.relationship.color,line:m=u.relationship.line,head:g=u.relationship.arrow,..._}=mergePropsFromRelationships(h.map(e=>e.$relationship),e?.$relationship);s.push({id:c.id,parent:c.boundary?.id??null,source:d,target:p,label:t??null,relations:h.map(e=>e.id),color:r,line:m,head:g,..._})}continue}}let{title:m,color:h=u.relationship.color,line:g=u.relationship.line,head:_=u.relationship.arrow,...v}=mergePropsFromRelationships(e.map(e=>e.$relationship)),y=exact({id:c.id,parent:c.boundary?.id??null,source:d,target:p,label:m??null,relations:e.map(e=>e.id),color:h,line:g,head:_,...v});s.push(y)}return[...r,...mergeBidirectionalEdges(s)]}t(toComputedEdges$1,`toComputedEdges`);function buildNodes$1(e,t){let r=buildComputedNodes(e.$styles,[...t.final].map(toNodeSource));for(let t of r.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let r=e.deployment.element(t.deploymentRef),s=r.isDeploymentNode()&&r.onlyOneInstance();if(!s)continue;t.title===r.name&&(t.title=s.title),t.description??=instanceSummary(s)??null,t.technology??=s.technology,j(t.tags)&&(t.tags=[...s.tags]),(!t.links||j(t.links))&&P(s.links,1)&&(t.links=[...s.links]);let c=e.$styles.defaults;t.shape===c.shape&&t.shape!==s.shape&&(t.shape=s.shape,t.notation=null),t.color===c.color&&t.color!==s.color&&(t.color=s.color,t.notation=null),!t.icon&&s.icon&&(t.icon=s.icon)}return r}t(buildNodes$1,`buildNodes`);function applyDeploymentViewRuleStyles(e,t){for(let r of e)!isViewRuleStyle$1(r)||r.targets.length===0||applyViewRuleStyle(r,ye(r.targets.map(deploymentExpressionToPredicate)),t);return t}function findCrossBoundarySameSourceOrTarget(e){let t=new L.default(()=>[]);for(let r of e)for(let e of r.relations.model)t.get(e).push(r);let r=new L.default(()=>new Set);for(let[e,s]of t)P(s,2)&&N(s,I(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),se(M(`group`)),Fe(),F(P(2)),he(He(D(M(`conn`)),sortConnectionsByBoundaryHierarchy(`desc`),pe((e,t,r)=>t===0||e.boundary===r[t-1].boundary),he(t=>{r.get(t).add(e)}))));return r}function findCrossBoundaryConnections(e){e=mergeConnections(e);let t=findCrossBoundarySameSourceOrTarget(e);for(let r of e){let{source:e,target:s}=r,c=r.relations.model;if(e.isDeploymentNode()!==s.isDeploymentNode()){let s=e.isDeploymentNode()?e:r.target;invariant(s.isDeploymentNode());let u=intersection(c,s.internalModelRelationships());for(let e of u)t.get(r).add(e);continue}if(e.isDeploymentNode()&&s.isDeploymentNode()){let c=union(intersection(r.relations.model,e.internalModelRelationships()),intersection(r.relations.model,s.internalModelRelationships()));for(let e of c)t.get(r).add(e)}}return N(t.entries(),imap(([e,t])=>e.update({model:t,deployment:null})),toArray())}function cleanCrossBoundary(e){return differenceConnections(e,findCrossBoundaryConnections(e))}function findRedundantConnections$1(e){return N(e,mergeConnections,Me((t,r)=>{let{source:s,target:c,relations:u}=r;if(s.isInstance()&&c.isInstance())return t;let d=wa.empty();if(s.isDeploymentNode()&&c.isDeploymentNode()){let[e]=_u(c,s,`directed`);e&&(d=u.intersect(e.relations))}for(let t of e)isNestedConnection(t,r)&&(d=d.union(u.intersect(t.relations)));return d.nonEmpty&&t.push(new ka(s,c,d)),t},[]))}t(findRedundantConnections$1,`findRedundantConnections`);function cleanRedundantRelationships(e){return differenceConnections(e,findRedundantConnections$1(e))}var StageInclude=class extends AbstractStageInclude{connectWithExisting(e,t=`both`){let r=this._connections.length,hasChanged=()=>this._connections.length>r;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(_u(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(vu(e,this.memory.elements,`directed`)),hasChanged()}let s=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(vu(e,s,`directed`));if(t===`out`||t===`both`)for(let e of s)this.addConnections(vu(e,this.memory.elements,`directed`));return hasChanged()}processConnections(e){let t=N(e,cleanCrossBoundary,cleanRedundantRelationships);return N(t,he(({source:e,target:t,boundary:r})=>{N(ze([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),pe(([e,t])=>e===t),fe(1),he(([s,c])=>{if(e===s&&t===c){this.addImplicit(r);return}s!==e&&s.isDeploymentNode()&&!s.onlyOneInstance()&&this.addImplicit(s),c!==t&&c.isDeploymentNode()&&!c.onlyOneInstance()&&this.addImplicit(c)}))})),t}},xu=class Memory extends AbstractMemory{static empty(){return new Memory({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new StageInclude(this,e)}stageExclude(e){return new StageExclude$1(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(e){return new Memory({...this.state,...e})}equals(e){return e instanceof Memory&&oe(this.state,e.state)}diff(e){return{added:{elements:toArray(difference(e.elements,this.elements)),explicits:toArray(difference(e.explicits,this.explicits)),final:toArray(difference(e.final,this.final)),connections:toArray(differenceConnections(e.connections,this.connections))},removed:{elements:toArray(difference(this.elements,e.elements)),explicits:toArray(difference(this.explicits,e.explicits)),final:toArray(difference(this.final,e.final)),connections:differenceConnections(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
77
- `)}[Oa](e,t,r){return this.toString()}};const Su={include:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c}))},exclude:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c}))}},Cu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.incoming)){for(let e of u){if(e.allOutgoing.isEmpty)continue;let t=applyPredicate(vu(e,[...resolveAscendingSiblings(e)],`directed`),c);s.addConnections(t)}return s}invariant(K.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.incoming);for(let e of u){let t=applyPredicate(vu(e,d,`directed`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.incoming)||K.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.incoming))return excludeModelRelations(resolveAllIncomingRelations(t,e.incoming),{stage:s,memory:r},c);if(K.isWildcard(e.incoming))return s;let u=filterIncomingConnections(resolveElements$1(t,e.incoming)),d=N(r.connections,F(u),applyPredicate(c));return s.excludeConnections(d),s}};function filterIncomingConnections(e){return ye(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>!satisfies(e.source)&&satisfies(e.target)}))}function resolveAllIncomingRelations(e,t){let r=resolveModelElements(e,t);return new Set(r.flatMap(e=>[...e.allIncoming]))}const wu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.outgoing)){for(let e of u)if(!e.allIncoming.isEmpty)for(let t of resolveAscendingSiblings(e)){let r=applyPredicate(_u(t,e,`directed`),c);s.addConnections(r)}return s}invariant(K.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.outgoing);for(let e of d){let t=applyPredicate(vu(e,u,`directed`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.outgoing)||K.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.outgoing))return excludeModelRelations(resolveAllOutgoingRelations(t,e.outgoing),{stage:s,memory:r},c);if(K.isWildcard(e.outgoing))return s;let u=filterOutgoingConnections(resolveElements$1(t,e.outgoing)),d=N(r.connections,F(u),applyPredicate(c));return s.excludeConnections(d),s}};function filterOutgoingConnections(e){return ye(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>satisfies(e.source)&&!satisfies(e.target)}))}function resolveAllOutgoingRelations(e,t){let r=resolveModelElements(e,t);return new Set(r.flatMap(e=>[...e.allOutgoing]))}const Tu={include:({expr:{source:e,target:t,isBidirectional:r=!1},model:s,stage:c,where:u})=>{if(K.isElementTagExpr(e)||K.isElementKindExpr(e)||K.isElementTagExpr(t)||K.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);invariant(!K.isModelRef(e),`Invalid source model ref in direct relation`),invariant(!K.isModelRef(t),`Invalid target model ref in direct relation`);let d=K.isWildcard(e),m=K.isWildcard(t),h=r?`both`:`directed`,g;switch(!0){case d&&m:g=N(yu(s.instances()),applyPredicate(u),D(e=>(c.addImplicit(e.boundary),e)));break;case!d&&m:{let t=resolveElements$1(s,e),c=filterOutgoingConnections(t),postFilter=c;if(r){let e=filterIncomingConnections(t);postFilter=t=>c(t)!==e(t)}g=N(t,I(e=>vu(e,resolveAscendingSiblings(e),h)),F(postFilter),applyPredicate(u));break}case d&&!m:{let e=resolveElements$1(s,t),c=filterIncomingConnections(e),postFilter=c;if(r){let t=filterOutgoingConnections(e);postFilter=e=>t(e)!==c(e)}g=N(e,I(e=>[...resolveAscendingSiblings(e)].flatMap(t=>_u(t,e,h))),F(postFilter),applyPredicate(u));break}default:{invariant(!d,`Inference failed - source should be a deployment ref`),invariant(!m,`Inference failed - target should be a deployment ref`);let r=resolveElements$1(s,e),c=resolveElements$1(s,t),p=filterOutgoingConnections(r),_=filterIncomingConnections(c);g=N(r,I(e=>vu(e,c,h)),F(e=>p(e)&&_(e)),applyPredicate(u))}}return c.addConnections(g),K.isDeploymentRef(e)&&p(e.selector)&&c.addImplicit(s.element(e.ref.deployment)),K.isDeploymentRef(t)&&p(t.selector)&&c.addImplicit(s.element(t.ref.deployment)),c},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=deploymentExpressionToPredicate(e.target),d=deploymentExpressionToPredicate(e.source),p;switch(!0){case K.isWildcard(e.source)&&K.isWildcard(e.target):return s.excludeConnections(applyPredicate(r.connections,c)),s;case K.isModelRef(e.source)&&K.isModelRef(e.target):return p=resolveRelationsBetweenModelElements({source:e.source,target:e.target,expr:e,model:t}),excludeModelRelations(p,{stage:s,memory:r},c);case K.isModelRef(e.source)&&K.isWildcard(e.target):return p=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(p,{stage:s,memory:r},c);case K.isModelRef(e.source):return p=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(p,{stage:s,memory:r},c,e=>u(e.target));case K.isModelRef(e.target):return p=resolveAllIncomingRelations(t,e.target),excludeModelRelations(p,{stage:s,memory:r},c,e=>d(e.source));default:let satisfies=t=>d(t.source)&&u(t.target)||e.isBidirectional===!0&&d(t.target)&&u(t.source),m=N(r.connections,F(satisfies),applyPredicate(c));return m.length===0||s.excludeConnections(m),s}}};function resolveRelationsBetweenModelElements({source:e,target:t,expr:r,model:s}){let c=resolveModelElements(s,e),u=resolveModelElements(s,t),d=r.isBidirectional?`both`:`directed`,p=[];for(let e of c)p.push(...findConnectionsBetween$3(e,u,d));return new Set(p.flatMap(e=>[...e.relations]))}const Eu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.inout)){for(let e of u){let t=matchConnections(vu(e,[...resolveAscendingSiblings(e)],`both`),c);s.addConnections(t)}return s}invariant(K.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.inout);for(let e of u){let t=matchConnections(vu(e,d,`both`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.inout)||K.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.inout)){let u=resolveModelElements(t,e.inout);return u.length===0?s:excludeModelRelations(union(new Set,...u.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:s,memory:r},c)}if(K.isWildcard(e.inout))return s;let u=resolveElements$1(t,e.inout),d=filterIncomingConnections(u),p=filterOutgoingConnections(u),m=N(r.connections,F(e=>d(e)!==p(e)),applyPredicate(c));return s.excludeConnections(m),s}},Du={include:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c})},exclude:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c})}},Ou={include:({model:e,stage:t,where:r})=>{let s=[],c;return c=r?N([...e.elements()],applyElementPredicate(r)):toArray(imap(e.roots(),e=>(e.onlyOneInstance()||s.push(...e.children()),e))),t.addExplicit(c),s.length>1?(t.addConnections(yu([...c,...s])),t.connectWithExisting(s)):t.addConnections(yu(c)),t.connectWithExisting(c),t},exclude:({stage:e,memory:t,where:r})=>{let s=N([...t.elements],applyElementPredicate(r));return e.exclude(s),e}};function predicateToPatch(e,{expr:t,where:r,...s}){switch(!0){case K.isElementTagExpr(t):case K.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case Hi.isCustom(t):case K.isCustom(t):case K.isModelRef(t):return;case K.isWhere(t):return Su[e]({...s,expr:t,where:r});case Hi.isWhere(t):return Du[e]({...s,expr:t,where:r});case K.isDeploymentRef(t):return ku[e]({...s,expr:t,where:r});case K.isWildcard(t):return Ou[e]({...s,expr:t,where:r});case Hi.isDirect(t):return Tu[e]({...s,expr:t,where:r});case Hi.isInOut(t):return Eu[e]({...s,expr:t,where:r});case Hi.isOutgoing(t):return wu[e]({...s,expr:t,where:r});case Hi.isIncoming(t):return Cu[e]({...s,expr:t,where:r});default:nonexhaustive(t)}}function excludeModelRelations(e,{stage:t,memory:r},s,c=()=>!0){if(e.size===0)return t;let u=N(r.connections,F(e=>c(e)),F(t=>hasIntersection(t.relations.model,e)),D(t=>t.update({deployment:null,model:intersection(t.relations.model,e)})),applyPredicate(s),F(e=>e.nonEmpty()));return u.length===0?t:t.excludeConnections(u)}function matchConnection(e,t){return applyPredicate(e,t).nonEmpty()}function applyPredicate(...e){if(e.length===1)return t=>applyPredicate(t,e[0]);let[t,r]=e;return r===null?t:S(t)?t.map(e=>applyPredicate(e,r)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>r(toFilterableRelation(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>r(toFilterableRelation(t)(e))))})}function applyElementPredicate(...e){if(e.length===1){let t=e[0];return t==null?e=>e:e=>e.filter(e=>t(toFilterable(e,e)))}let[t,r]=e;return S(t)?r==null?t:t.filter(e=>r(toFilterable(e,e))):r?.(toFilterable(t,t))??!0}function matchConnections(e,t){return t?N(e,F(e=>matchConnection(e,t))):e}function toFilterable(e,t){if(isElementModel(e)){let r=isDeploymentElementModel(t)&&isDeployedInstanceModel(t)?t:null;return{kind:e.kind,tags:[...e.tags,...r?.tags??[]],metadata:r?.metadata??e.metadata}}if(isNestedElementOfDeployedInstanceModel(e))return de(e.element,[`tags`,`kind`,`metadata`]);if(isDeployedInstanceModel(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags],metadata:e.metadata};if(isDeploymentNodeModel(e))return de(e,[`tags`,`kind`,`metadata`]);nonexhaustive(e)}function toFilterableRelation(e){return t=>({tags:t.tags,kind:t.kind,metadata:t.metadata,source:toFilterable(t.source,e.source),target:toFilterable(t.target,e.target)})}function resolveAscendingSiblings(e){let t=new Set;for(let r of e.descendingSiblings())t.add(r);return t}const ku={include:e=>{let{expr:t,where:r}=e,s=e.model.element(t.ref.deployment);if(isDeployedInstanceModel(s))return applyElementPredicate(s,r)&&(e.stage.addExplicit(s),e.stage.connectWithExisting(s)),e.stage;switch(!0){case t.selector===`expanded`:includeDeployedNodeWithExpanded(s,e);break;case t.selector===`children`:includeDeployedNodeChildren(s,e);break;case t.selector===`descendants`:includeDeployedNodeDescendants(s,e);break;default:applyElementPredicate(s,r)&&(e.stage.addExplicit(s),e.stage.connectWithExisting(s))}return e.stage},exclude:({expr:e,stage:t,memory:r,where:s})=>{let c=deploymentExpressionToPredicate(e),u=N([...r.elements],F(c),applyElementPredicate(s));return t.exclude(u),t}};function includeDeployedNodeChildren(e,{stage:t,where:r}){let s=applyElementPredicate([...e.children()],r);s.length!==0&&(t.addImplicit(e),t.addConnections(yu(s)),t.connectWithExisting(s),t.addExplicit(s))}function includeDeployedNodeWithExpanded(e,{memory:t,stage:r,where:s}){r.addImplicit(e),r.connectWithExisting(e);let c=applyElementPredicate([...e.children()],s),u=!1;for(let e of c)if(vu(e,t.elements).length>0){u=!0;break}u&&(r.connectWithExisting(c,`in`),r.addConnections(yu(c)),r.connectWithExisting(c,`out`)),r.addImplicit(c),r.connections.length>0&&r.addExplicit(e)}function includeDeployedNodeDescendants(e,{stage:t,where:r}){let dfs=e=>{let s=[];for(let t of e.children())t.isDeploymentNode()&&s.push(...dfs(t)),applyElementPredicate(t,r)&&s.push(t);return t.connectWithExisting(s,`in`),t.addConnections(yu(s)),t.addImplicit(s),s},s=dfs(e);if(s.length===0)return;t.connectWithExisting(s,`out`);let c=findConnectedElements(t);N(s,F(e=>c.has(e)),he(e=>t.addExplicit(e)))}function findConnectedElements(e){return N(e.mergedConnections(),cleanCrossBoundary,cleanRedundantRelationships,Me((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Au=class StageFinal$1{static{t(this,`StageFinal`)}memory;includeAncestors;static for(e,t){return new StageFinal$1(e,t)}constructor(e,t){this.memory=e,this.includeAncestors=t}step1CleanConnections(e){if(e.connections.length<2)return e;let t=N(e.connections,cleanCrossBoundary,cleanRedundantRelationships),r=differenceConnections(e.connections,t);if(r.length===0)return e;let s=e.stageExclude({});return s.excludeConnections(r,!0),s.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),r=union(e.final,this.memory.explicits),s=new L.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)s.get(e).add(t.boundary);for(let[e,c]of s)if(!(c.size<2))for(let e of c)t.delete(e)&&r.add(e);let c=new Set(r),isFinalOrHasIncludedDescendant=e=>{for(let t of c)if(e===t||isAncestor(e,t))return!0;return!1};return N(difference(t,c),ifilter(e=>e.isDeploymentNode()),toArray(),sortByFqnHierarchically,he(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){r.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&r.add(e)})),e.update({final:r})}step3ProcessBoundaries(e){let t=new Set;for(let r of e.connections)r.boundary&&t.add(r.boundary);let r=treeFromMemoryState(e,`final`),s=e.stageExclude({}),isRemovable=s=>!(t.has(s)||e.explicits.has(s)||r.hasInOut(s)||r.root.has(s)),c=A([...r.root]);c&&!e.explicits.has(c)&&s.exclude(c);for(let t of e.final){let e=A(r.children(t));e&&!r.hasInOut(e)&&isRemovable(t)&&s.exclude(t)}return s.isDirty()?s.commit():e}step4AddAncestor(e){let t=new Set;for(let r of e.final)for(let e of r.ancestors())t.add(e);if(t.size>0){let r=union(e.final,t);return e.update({final:r})}return e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e),r=this.step3ProcessBoundaries(t);return this.includeAncestors===!0?this.step4AddAncestor(r):r}};const ju=createRelationExpressionToPredicates(deploymentExpressionToPredicate);function buildExpandPredicate$1(e,t){let r=[],s=[];for(let e of t)if(isViewRulePredicate$1(e)&&`include`in e)for(let t of e.include)Hi.isCustom(t)&&(t.customRelation.multiple===!0?r.push(t):t.customRelation.multiple===!1&&s.push(t));let c=new Set,u=e.specification.relationships;for(let e of Object.keys(u)){let t=u[e];(t?.style??t)?.multiple&&c.add(e)}if(r.length===0&&s.length===0&&c.size===0)return;let d=r.map(e=>({pred:ju(e.customRelation.expr)})),p=s.map(e=>({pred:ju(e.customRelation.expr)}));return(e,t)=>{let resolveEndpoint=e=>{if(e&&typeof e==`object`){if(`tags`in e&&`kind`in e&&`metadata`in e)return e;if(e.instance&&e.element)return{id:e.id,tags:e.instance.tags,kind:e.element.kind,metadata:e.instance.metadata}}return e??{}},r=resolveEndpoint(t?.source??e.source),s=resolveEndpoint(t?.target??e.target);if(p.length>0){for(let{pred:t}of p)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(c.size>0){let t=e.kind;if(t&&c.has(t))return!0}if(d.length>0){for(let{pred:t}of d)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}t(buildExpandPredicate$1,`buildExpandPredicate`);function processPredicates$1(e,t){let r=xu.empty(),s=!1;for(let c of t){if(isViewRulePredicate$1(c)){let t=`include`in c?`include`:`exclude`,s=c.include??c.exclude;for(let c of s){let s=t===`include`?r.stageInclude(c):r.stageExclude(c);s=predicateToPatch(t,{expr:c,model:e,stage:s,memory:r,where:null})??s,r=s.commit()}}`includeAncestors`in c&&(s=c.includeAncestors)}return Au.for(r,s).commit()}t(processPredicates$1,`processPredicates`);function computeDeploymentView(e,{docUri:t,rules:r,...s}){let c=processPredicates$1(e.deployment,r),u=buildNodes$1(e,c),d=buildExpandPredicate$1(e,r),p=toComputedEdges$1(c.connections,d);linkNodesWithEdges(u,p);let m=topologicalSort$1({nodes:u,edges:p}),h=applyDeploymentViewRuleStyles(r,m.nodes),g=Ce(r,isViewRuleAutoLayout$1),_=buildElementNotations(h);return calcViewLayoutHash({...s,[Ri]:`computed`,[zi]:`deployment`,autoLayout:{direction:g?.direction??`TB`,...g?.nodeSep&&{nodeSep:g.nodeSep},...g?.rankSep&&{rankSep:g.rankSep}},edges:m.edges,nodes:D(h,e=>(e.icon===`none`&&delete e.icon,e)),..._.length>0&&{notation:{nodes:_}}})}function flattenGroupRules(e){return t=>isViewRuleGroup$1(t)?t.groupRules.flatMap(flattenGroupRules(e)):isViewRulePredicate$1(t)&&`include`in t?t.include.filter(e):[]}function applyCustomElementProperties(e,t){let r=e.flatMap(flattenGroupRules(q.isCustom));if(r.length===0)return t;let s=[...t];for(let{custom:{expr:e,...t}}of r){let{border:r,opacity:c,multiple:u,iconColor:d,iconSize:p,iconPosition:m,padding:h,size:g,textSize:_,...v}=We(t,k),b=exact({border:r,opacity:c,multiple:u,iconColor:d,iconSize:p,iconPosition:m,padding:h,size:g,textSize:_}),x=!y(b),S=!y(v),w=elementExprToPredicate(e);s.forEach((e,t)=>{isGroupElementKind(e)||!w(e)||(S&&(e={...e,...v,isCustomized:!0}),x&&(e={...e,isCustomized:!0,style:{...e.style,...b}}),s[t]=e)})}return s}function resolveGlobalRulesInElementView(e,t){return e.reduce((e,r)=>{if(isViewRuleGlobalPredicateRef$1(r)){let s=t.predicates[r.predicateId];return k(s)?e:e.concat(s)}if(isViewRuleGlobalStyle$1(r)){let s=t.styles[r.styleId];return k(s)?e:e.concat(s)}return e.push(r),e},[])}function resolveGlobalRulesInDynamicView(e,t){return e.reduce((e,r)=>{if(isViewRuleGlobalPredicateRef$1(r)){let s=t.dynamicPredicates[r.predicateId];return k(s)?e:e.concat(s)}if(isViewRuleGlobalStyle$1(r)){let s=t.styles[r.styleId];return k(s)?e:e.concat(s)}return e.push(r),e},[])}function elementsFromIncludeProperties(e,t){let r=new Set;for(let s of t)if(isViewRulePredicate$1(s))for(let t of s.include){let s=elementExprToPredicate(t);for(let t of e.elements())s(t)&&r.add(t)}return r}const flattenSteps=e=>{if(isDynamicStepsParallel(e)){let t=[],r=[];for(let s of e.__parallel)if(isDynamicStepsSeries(s)){let[e,...c]=s.__series;t.push(e),r.push(...c)}else t.push(s);return[...t,...r]}return isDynamicStepsSeries(e)?[...e.__series]:e};function elementsFromSteps(e,t){let r=[],addActor=(...[e,t])=>{if(!r.includes(e)){let s=r.indexOf(t);if(s>0){r.splice(s,0,e);return}else r.push(e)}r.includes(t)||r.push(t)};for(let s of I(t,flattenSteps)){let t=e.element(s.source),c=e.element(s.target),u=r.indexOf(t),d=r.indexOf(c);u>=0&&d>=0||(s.isBackward?addActor(c,t):addActor(t,c))}return new Set(r)}function findRelations(e,t,r){let s=findConnection$3(e,t,`directed`).flatMap(e=>[...e.relations]).sort(compareRelations);if(!isNonEmptyArray(s))return{};if(s.length===1){let e=s[0];return exact({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 c=N(s,I(e=>e.tags),le()),u=P(c,1)?c:void 0,d=D(s,e=>e.id),p=Ie(s).$relationship.navigateTo;p===r&&(p=void 0),p||=N(s,I(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==r?e.$relationship.navigateTo:[]),le(),A());let m=N(s,Me((e,{title:t,technology:r,$relationship:s})=>(T(t)&&e.title.add(t),T(s.color)&&e.color.add(s.color),T(s.line)&&e.line.add(s.line),T(s.kind)&&e.kind.add(s.kind),T(r)&&e.technology.add(r),T(s.description)&&!e.description.some(oe(s.description))&&e.description.push(s.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return exact({tags:u??void 0,relations:d,navigateTo:p,kind:A([...m.kind]),title:A([...m.title]),color:A([...m.color]),line:A([...m.line]),technology:A([...m.technology]),description:A(m.description)})}var DynamicViewCompute=class{model;view;steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:r,...s}=this.view,c=resolveGlobalRulesInDynamicView(t,this.model.globals),u=elementsFromIncludeProperties(this.model,c),d=elementsFromSteps(this.model,r),p=N(union(intersection(u,d),d,u),toArray(),sortParentsFirst),m=p.reduce((e,t,r,s)=>{for(let c=r+1;c<s.length;c++){let r=s[c];if(isAncestor(t,r)){e.push(t);break}}return e},[]),processStep=(e,t,r)=>{if(isDynamicStepsSeries(e)){for(let s of e.__series)t=processStep(s,t,r);return t}let s=r?stepEdgeId(r,t):stepEdgeId(t),{source:c,target:u,title:d,isBackward:h,navigateTo:g,notation:_,...v}=e,y=this.model.element(c),b=p.indexOf(y);invariant(b>=0,`Source ${c} not found`);let x=this.model.element(u),S=p.indexOf(x);invariant(S>=0,`Target ${u} not found`),(m.includes(y)||m.includes(x))&&console.error(`Step ${y.id} -> ${x.id} because it involves a compound`);let{title:w,relations:E,navigateTo:D,...ee}=findRelations(y,x,this.view.id),te=T(g)&&g!==this.view.id?g:D,k=e.kind?this.model.specification.relationships[e.kind]:void 0;return this.steps.push(exact({...ee,...!e.technology&&!ee.technology&&k?.technology&&{technology:k.technology},...!e.color&&!ee.color&&k?.color&&{color:k.color},...!e.line&&!ee.line&&k?.line&&{line:k.line},...!e.head&&k?.head&&{head:k.head},...!e.tail&&k?.tail&&{tail:k.tail},...v,id:s,source:y,target:x,navigateTo:te,title:d??w,relations:E??[],isBackward:b>S})),t+1},h=1;for(let e of r){if(isDynamicStepsParallel(e)){let t=1;for(let r of e.__parallel)t=processStep(r,t,h);h++;continue}h=processStep(e,h)}let g=buildComputedNodes(this.model.$styles,p.map(elementModelToNodeSource)),_=this.model.$styles.defaults.relationship,v=this.steps.map(({id:e,source:t,target:r,relations:s,title:c,isBackward:u,tags:d,...p})=>{let m=nonNullable(g.get(t.id),`Source node ${t.id} not found`),h=nonNullable(g.get(r.id),`Target node ${r.id} not found`),v={id:e,parent:commonAncestor(t.id,r.id),source:m.id,target:h.id,label:c??null,relations:s,color:_.color,line:_.line,head:_.arrow,tags:d??[],...p};for(u&&(v.dir=`back`);v.parent&&!g.has(v.parent);)v.parent=parentFqn(v.parent);m.outEdges.push(v.id),h.inEdges.push(v.id);for(let e of ancestorsFqn(v.source)){if(e===v.parent)break;g.get(e)?.outEdges.push(v.id)}for(let e of ancestorsFqn(v.target)){if(e===v.parent)break;g.get(e)?.inEdges.push(v.id)}return v}),y=applyCustomElementProperties(c,applyViewRuleStyles(c,p.map(e=>nonNullable(g.get(e.id))))),b=Ce(c,isViewRuleAutoLayout$1),x=buildElementNotations(y);return calcViewLayoutHash({...s,[zi]:`dynamic`,[Ri]:`computed`,variant:s.variant??`diagram`,autoLayout:{direction:b?.direction??`LR`,...b?.nodeSep&&{nodeSep:b.nodeSep},...b?.rankSep&&{rankSep:b.rankSep}},nodes:D(y,e=>(e.icon===`none`&&delete e.icon,e)),edges:v,...x.length>0&&{notation:{nodes:x}}})}};function computeDynamicView(e,t){return new DynamicViewCompute(e,t).compute()}function applyCustomRelationProperties(e,t,r){let s=e.flatMap(flattenGroupRules(Wi.isCustom)),c=Array.from(r);if(s.length===0||c.length===0)return c;for(let{customRelation:{expr:e,title:r,description:u,notes:d,multiple:p,...m}}of s){let s=u?{description:MarkdownOrString$1(u)}:{},p=d?{notes:MarkdownOrString$1(d)}:{},h=We(m,k),g=du(e);c.forEach((e,u)=>{let d,m;for(let r of t)if(r.id===e.source&&(d=r),r.id===e.target&&(m=r),d&&m)break;!d||!m||g({source:d,target:m,...de(e,[`kind`,`tags`])})&&(c[u]={...e,...h,...s,...p,label:r??e.label,isCustomized:!0})})}return c}function findRedundantConnections(e){return N([...e],mergeConnections,Me((e,t,r,s)=>{let c=findDescendantConnections(s,t),u=union(...c.map(M(`relations`))),d=intersection(t.relations,u);if(c.length>0&&(d=union(d,t.directRelations)),findDeepestNestedConnection(s,t.reversed())&&(d=union(d,t.directRelations)),d.size<t.relations.size){let e=s.some(isAnyInOut(t.source)),r=s.some(isAnyInOut(t.target));e&&(d=union(d,toSet(ifilter(t.relations,isOutgoing(t.source))))),r&&(d=union(d,toSet(ifilter(t.relations,isIncoming(t.target)))))}return d.size>0&&e.push(t.update(d)),e},[]))}var Mu=class StageFinal{memory;static for(e){return new StageFinal(e)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=findRedundantConnections(e.connections);if(t.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(t,!0),r.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),r=union(e.final,this.memory.explicits),s=new Set(r),isFinalOrHasIncludedDescendant=e=>{for(let t of s)if(e===t||isAncestor(e,t))return!0;return!1};return N(difference(t,s),toArray(),sortByFqnHierarchically,he(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){r.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&r.add(e)})),e.update({final:r})}step3ProcessBoundaries(e){let t=new Set;for(let r of e.connections)r.boundary&&r.boundary!==r.source&&r.boundary!==r.target&&t.add(r.boundary);let r=treeFromMemoryState(e,`final`),s=e.stageExclude({}),isRemovable=s=>!(t.has(s)||e.explicits.has(s)||r.hasInOut(s)||r.root.has(s)),c=A([...r.root]);c&&!e.explicits.has(c)&&s.exclude(c);for(let t of e.final){let e=A(r.children(t));e&&!r.hasInOut(e)&&isRemovable(t)&&s.exclude(t)}return s.isDirty()?s.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:Nu,findConnectionsBetween:Pu,findConnectionsWithin:Fu}=Ma;function resolveElements(e,t){switch(!0){case q.isElementKindExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case q.isElementTagExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let r=e.element(G.flatten(t.ref));return[r,...r.children()]}case t.selector===`children`:case t.selector===`descendants`:{let r=e.element(G.flatten(t.ref)),s=t.selector===`children`?toArray(r.children()):toArray(r.descendants());return s&&s.length>0?s:[r]}case q.isModelRef(t):return[e.element(G.flatten(t.ref))];default:nonexhaustive(t)}}function includeDescendantsFromMemory(e,t){if(t.isEmpty()||e.length===0)return e;let r=ye(e.map(e=>isDescendantOf(e))),s=toArray(ifilter(t.elements,t=>!e.includes(t)&&r(t)));return[...e,...s]}function resolveAndIncludeFromMemory(e,{memory:t,model:r}){let s=resolveElements(r,e);return q.isModelRef(e)?e.selector===`descendants`?s:includeDescendantsFromMemory(s,t):s}const Iu={include:({expr:e,model:t,stage:r,where:s})=>{let c=t.element(G.flatten(e.ref));s(c)&&(r.addExplicit(c),r.connectWithExisting(c));let u=[...c.children()].filter(s),d=[];for(let e of u)r.addImplicit(e),r.connectWithExisting(e)&&d.push(e);return r.addConnections(Fu(d)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},Lu={include:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));if(c.length!==0)return r.addExplicit(c),r.connectWithExisting(c),r.addConnections(Fu(c)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},Ru={include:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));if(c.length!==0)return r.addExplicit(c),r.connectWithExisting(c),r.addConnections(Fu(c)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},NoWhere=()=>!0,NoFilter=e=>e,hashEdgeId=(e,t,r)=>stringHash$1(`model:${e}:${t}:${r}`);function toComputedEdges(e,t){return e.flatMap(e=>{let r=[...e.relations];invariant(P(r,1),`Edge must have at least one relation`);let s=e.source.$model.$styles.defaults,c=e.source.id,u=e.target.id,d=F(r,e=>e.source.id===c&&e.target.id===u);if(t&&r.length>1){let[d,p]=N(r,Ge(r=>t(r,e)));if(d.length>0){let t=d.map(t=>{let{title:r,color:d=s.relationship.color,line:p=s.relationship.line,head:m=s.relationship.arrow,...h}=mergePropsFromRelationships([t.$relationship],t.$relationship);return{id:hashEdgeId(c,u,t.id),parent:e.boundary?.id??null,source:c,target:u,label:r??null,relations:[t.id],color:d,line:p,head:m,...h}});if(p.length>0){let{title:r,color:d=s.relationship.color,line:m=s.relationship.line,head:h=s.relationship.arrow,...g}=mergePropsFromRelationships(p.map(e=>e.$relationship),A(F(p,e=>e.source.id===c&&e.target.id===u))?.$relationship);t.push({id:e.id,parent:e.boundary?.id??null,source:c,target:u,label:r??null,relations:p.map(e=>e.id),color:d,line:m,head:h,...g})}return t}}let{title:p,color:m=s.relationship.color,line:h=s.relationship.line,head:g=s.relationship.arrow,..._}=mergePropsFromRelationships(r.map(e=>e.$relationship),A(d)?.$relationship);return[exact({id:e.id,parent:e.boundary?.id??null,source:c,target:u,label:p??null,relations:r.map(e=>e.id),color:m,line:h,head:g,..._})]})}function buildNodes(e,t){return buildComputedNodes(e.$styles,[...t.final].map(elementModelToNodeSource),t.groups)}const zu=q.isWildcard,isAncestorOrDescendantOf=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Bu={include:({expr:{source:e,target:t,isBidirectional:r=!1},memory:s,model:c,stage:u,where:d,filterWhere:p})=>{let m=zu(e),h=zu(t),g=[];switch(!0){case m&&h&&s.isEmpty()&&d!==NoWhere:{let e=N(c.relationships(),ifilter(d),toArray(),D(e=>new Aa(e.source,e.target,new Set([e]))));return u.addConnections(e),u}case m&&h&&!s.isEmpty()&&d!==NoWhere:g.push(...Fu(s.elements));break;case m&&h:g.push(...Fu(c.roots()));break;case!m&&h&&d!==NoWhere:{let t=N(resolveElements(c,e),I(e=>N(e,ke(_e(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(d),iunique(),toArray(),Ge(t=>t.source===e),([t,r])=>Ne(N(t,F(t=>!isAncestorOrDescendantOf(e,t.target)),D(t=>new Aa(e,t.target,new Set([t])))),N(r,F(t=>!isAncestorOrDescendantOf(e,t.source)),D(t=>new Aa(t.source,e,new Set([t]))))))));return u.addConnections(t),u}case!m&&h:{let[t,u]=resolveWildcard(e,{memory:s,model:c}),d=r?`both`:`directed`;for(let e of t)g.push(...Pu(e,u,d));break}case m&&!h&&d!==NoWhere:{let e=N(resolveElements(c,t),I(e=>N(e,ke(_e(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(d),toArray(),Ge(t=>t.target===e),([t,r])=>Ne(N(r,F(t=>!isAncestorOrDescendantOf(e,t.target)),D(t=>new Aa(e,t.target,new Set([t])))),N(t,F(t=>!isAncestorOrDescendantOf(e,t.source)),D(t=>new Aa(t.source,e,new Set([t]))))))));return u.addConnections(e),u}case m&&!h:{let[e,u]=resolveWildcard(t,{memory:s,model:c}),d=r?`both`:`directed`;for(let t of u)g.push(...Pu(t,e,d));break}default:{invariant(!zu(e),`Inference failed - source must be not a wildcard`),invariant(!zu(t),`Inference failed - target must be not a wildcard`);let u=resolveAndIncludeFromMemory(e,{memory:s,model:c}),d=resolveAndIncludeFromMemory(t,{memory:s,model:c}),p=r?`both`:`directed`;for(let e of u)g.push(...Pu(e,d,p))}}return u.addConnections(p(g)),u},exclude:({expr:{source:e,target:t,isBidirectional:r},model:s,memory:c,stage:u,where:d})=>{let p=zu(e),m=zu(t),h;switch(!0){case p&&m:h=N(c.connections,I(He(M(`relations`),ifilter(d),toArray())),toSet());break;case!p&&m:h=N(resolveElements(s,e),I(e=>N(e,ke(_e(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(d),toArray())),toSet());break;case p&&!m:h=N(resolveElements(s,t),I(e=>N(e,ke(_e(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(d),toArray())),toSet());break;default:{invariant(!zu(e),`Inference failed - source must be not a wildcard`),invariant(!zu(t),`Inference failed - target must be not a wildcard`);let c=resolveElements(s,e),u=resolveElements(s,t),p=new Set;for(let e of c)for(let t of u)isSameHierarchy(e,t)||(p=union(p,intersection(e.allOutgoing,t.allIncoming),r?intersection(t.allOutgoing,e.allIncoming):new Set));h=toSet(ifilter(p,d))}}return u.excludeRelations(h),u}};function resolveWildcard(e,{memory:t,model:r}){let s=resolveElements(r,e);if(!P(s,1))return[[],[]];if(q.isModelRef(e)){let c=toArray(r.element(G.flatten(e.ref)).ascendingSiblings());return[includeDescendantsFromMemory(s,t),includeDescendantsFromMemory(c,t)]}return[s,N(s,D(e=>e.ascendingSiblings()),iflat(),iunique(),toArray(),e=>includeDescendantsFromMemory(e,t))]}const Vu={include:({expr:e,scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=e.incoming,p=[];if(q.isWildcard(d)){if(!t)return;for(let e of t.ascendingSiblings())p.push(...Nu(e,t,`directed`))}else{let e=resolveAndIncludeFromMemory(d,{memory:s,model:r}),t=[...s.elements];t.length===0&&t.push(...le(e.flatMap(e=>[...e.ascendingSiblings()])));let c=incomingConnectionPredicate(r,d);for(let r of t)p.push(...Pu(r,e,`directed`).filter(c))}return c.addConnections(u(p)),c},exclude:({expr:{incoming:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allIncoming)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allIncoming]))}return s.excludeRelations(new Set(u.filter(c))),s}};function incomingConnectionPredicate(e,t){switch(!0){case q.isElementKindExpr(t):case q.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.target)}case q.isModelRef(t)&&t.selector===`children`:{let r=G.flatten(t.ref);return ye([...e.children(r)].map(e=>Da.isIncoming(e.id)))}case q.isModelRef(t)&&t.selector===`descendants`:{let r=G.flatten(t.ref);return ye([Da.isInside(r),...[...e.children(r)].map(e=>Da.isIncoming(e.id))])}case q.isModelRef(t)&&t.selector===`expanded`:{let e=G.flatten(t.ref);return ye([Da.isIncoming(e),Da.isInside(e)])}case q.isModelRef(t):{let e=G.flatten(t.ref);return Da.isIncoming(e)}default:nonexhaustive(t)}}const Hu={include:({expr:{inout:e},scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=[];if(q.isWildcard(e)){if(!t)return;d.push(...Pu(t,t.ascendingSiblings()))}else{let t=resolveAndIncludeFromMemory(e,{memory:s,model:r}),c=[...s.elements];c.length===0&&(c=le(t.flatMap(e=>toArray(e.ascendingSiblings()))));for(let e of t)d.push(...Pu(e,c))}return c.addConnections(u(d)),c},exclude:({expr:{inout:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allOutgoing),u.push(...r.allIncoming)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return s.excludeRelations(toSet(u.filter(c))),s}},Uu={include:({expr:e,scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=e.outgoing,p=[];if(q.isWildcard(d)){if(!t)return;p.push(...Pu(t,t.ascendingSiblings(),`directed`))}else{let e=resolveAndIncludeFromMemory(d,{memory:s,model:r}),t=[...s.elements];t.length===0&&t.push(...le(e.flatMap(e=>[...e.ascendingSiblings()])));let c=outgoingConnectionPredicate(r,d);for(let r of e)p.push(...Pu(r,t,`directed`).filter(c))}return c.addConnections(u(p)),c},exclude:({expr:{outgoing:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allOutgoing)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allOutgoing]))}return s.excludeRelations(toSet(u.filter(c))),s}};function outgoingConnectionPredicate(e,t){switch(!0){case q.isElementKindExpr(t):case q.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.source)}case q.isModelRef(t)&&t.selector===`children`:{let r=G.flatten(t.ref);return ye([...e.children(r)].map(e=>Da.isOutgoing(e.id)))}case q.isModelRef(t)&&t.selector===`descendants`:{let r=G.flatten(t.ref);return ye([Da.isInside(r),...[...e.children(r)].map(e=>Da.isOutgoing(e.id))])}case q.isModelRef(t)&&t.selector===`expanded`:{let e=G.flatten(t.ref);return ye([Da.isOutgoing(e),Da.isInside(e)])}case q.isModelRef(t):{let e=G.flatten(t.ref);return Da.isOutgoing(e)}default:nonexhaustive(t)}}const Wu={include:({scope:e,model:t,stage:r,memory:s,where:c})=>{if(!e){let e=c===NoWhere?[...t.roots()]:toArray(ifilter(t.elements(),c));if(e.length===0)return;let[s,u]=Ge(e,e=>!e.imported);return r.addExplicit(s),r.addImplicit(u),r.addConnections(Fu(e)),r.connectWithExisting(e),r}let u=toArray(ifilter(e.children(),c)),d=u.length>0;if(!d){let t=Pu(e,e.siblings()),s=e.parent;t.length===0&&s&&r.addExplicit(s),u.push(e)}r.addExplicit(e);let p=toSet([...s.elements,...e.descendingSiblings()]);for(let e of p)r.addConnections(Pu(e,u,`directed`));d&&(r.addConnections(Fu(u)),r.addExplicit(u));for(let e of u)r.addConnections(Pu(e,p,`directed`));return r},exclude:({scope:e,memory:t,stage:r,where:s})=>s===NoWhere?e?(r.exclude([e,...e.descendants()]),r):hu.empty(t.scope).stageExclude(r.expression):(r.exclude(F([...t.elements],s)),r)};function processElementPredicate(e,t,r){switch(!0){case q.isCustom(e):return t===`include`?processElementPredicate(e.custom.expr,t,r):r.stage;case q.isWhere(e):{let s=whereOperatorAsPredicate(e.where.condition),filterWhere=e=>F(e,s);return processElementPredicate(e.where.expr,t,{...r,where:s,filterWhere})}case q.isModelRef(e)&&e.selector===`expanded`:return Iu[t]({...r,expr:e})??r.stage;case q.isWildcard(e):return Wu[t]({...r,expr:e})??r.stage;case q.isElementKindExpr(e):case q.isElementTagExpr(e):return Lu[t]({...r,expr:e})??r.stage;case q.isModelRef(e):return Ru[t]({...r,expr:e})??r.stage;default:nonexhaustive(e)}}function processRelationtPredicate(e,t,r){switch(!0){case Wi.isCustom(e):return t===`include`?processRelationtPredicate(e.customRelation.expr,t,r):r.stage;case Wi.isWhere(e):{let s=whereOperatorAsPredicate(e.where.condition),filterRelations=e=>new Set(F([...e],s)),filterWhere=e=>N(e,D(e=>new Aa(e.source,e.target,filterRelations(e.relations))),F(e=>e.nonEmpty()));return processRelationtPredicate(e.where.expr,t,{...r,where:s,filterWhere})}case Wi.isInOut(e):return Hu[t]({...r,expr:e})??r.stage;case Wi.isDirect(e):return Bu[t]({...r,expr:e})??r.stage;case Wi.isOutgoing(e):return Uu[t]({...r,expr:e})??r.stage;case Wi.isIncoming(e):return Vu[t]({...r,expr:e})??r.stage;default:nonexhaustive(e)}}function process_predicates(e,t,r){let s={model:e,scope:t.scope,where:NoWhere,filterWhere:NoFilter};for(let c of r){if(isViewRuleGroup$1(c)){t=process_predicates(e,gu.enter(t,c),c.groupRules),invariant(t instanceof gu,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(isViewRulePredicate$1(c)){let e=`include`in c?`include`:`exclude`,r=c.include??c.exclude;for(let c of r){let r=e===`include`?t.stageInclude(c):t.stageExclude(c);switch(!0){case Gi.isFqnExpr(c):r=processElementPredicate(c,e,{...s,stage:r,memory:t})??r;break;case Gi.isRelationExpr(c):r=processRelationtPredicate(c,e,{...s,stage:r,memory:t})??r;break;default:nonexhaustive(c)}t=r.commit()}}}return t}function processPredicates(e,t,r){return t=process_predicates(e,t,r),Mu.for(t).commit()}function buildExpandPredicate(e,t){let r=t.flatMap(flattenGroupRules(Wi.isCustom)).filter(e=>e.customRelation.multiple===!0),s=t.flatMap(flattenGroupRules(Wi.isCustom)).filter(e=>e.customRelation.multiple===!1),c=new Set,u=e.specification.relationships;for(let e of Object.keys(u)){let t=u[e];(t?.style??t)?.multiple&&c.add(e)}if(r.length===0&&s.length===0&&c.size===0)return;let d=r.map(e=>({pred:du(e.customRelation.expr)})),p=s.map(e=>({pred:du(e.customRelation.expr)}));return(e,t)=>{let r=t?.source??e.source,s=t?.target??e.target;if(p.length>0){for(let{pred:t}of p)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(c.size>0){let t=e.kind;if(t&&c.has(t))return!0}if(d.length>0){for(let{pred:t}of d)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}function computeElementView(e,{docUri:t,rules:r,...s}){let c=resolveGlobalRulesInElementView(r,e.globals),u=s.viewOf?e.asComputed.element(s.viewOf):null,d=processPredicates(e,hu.empty(u),c);d.isEmpty()&&u&&(d=d.update({final:new Set([u])})),d=assignElementsToGroups(d);let p=buildNodes(e,d),m=buildExpandPredicate(e,c),h=toComputedEdges(d.connections,m);linkNodesWithEdges(p,h);let g=topologicalSort$1({nodes:p,edges:h}),_=applyCustomElementProperties(c,applyViewRuleStyles(c,g.nodes)),v=Ce(c,isViewRuleAutoLayout$1),y=buildElementNotations(_),b=collectRankConstraints(c,_);return calcViewLayoutHash({...s,_stage:`computed`,autoLayout:{direction:v?.direction??`TB`,...v?.nodeSep&&{nodeSep:v.nodeSep},...v?.rankSep&&{rankSep:v.rankSep}},edges:applyCustomRelationProperties(c,_,g.edges),nodes:D(_,e=>(e.icon===`none`&&delete e.icon,e)),...y.length>0&&{notation:{nodes:y}},...b.length>0&&{ranks:b}})}function collectRankConstraints(e,t){let r=[];for(let s of e){if(!isViewRuleRank$1(s)||s.targets.length===0)continue;let e=N(t,F(ye(s.targets.map(elementExprToPredicate))),D(e=>e.id));P(e,1)&&r.push({type:s.rank,nodes:e})}return r}function assignElementsToGroups(e){if(e.groups.length===0)return e;let t=new L.default(()=>new Set),r=new Map,isAncestorAssigned=e=>{for(let s of e.ancestors()){let c=r.get(s);if(c)return r.set(e,c),t.get(c).add(e),!0}return!1},isDescendantAssigned=e=>{for(let s of e.descendants(`asc`)){let c=r.get(s);if(c)return r.set(e,c),t.get(c).add(e),!0}return!1};if(N(sortParentsFirst([...e.explicitFirstSeenIn.keys()]),he(s=>{if(!isAncestorAssigned(s)){let c=nonNullable(e.explicitFirstSeenIn.get(s));r.set(s,c),t.get(c).add(s)}})),N(sortParentsFirst([...e.lastSeenIn.keys()]),F(e=>!r.has(e)),he(s=>{if(isAncestorAssigned(s)||isDescendantAssigned(s))return;let c=nonNullable(e.lastSeenIn.get(s));r.set(s,c),t.get(c).add(s)})),t.size===0)return e;let s=e.groups.map(e=>{let r=t.get(e.id);return r?e.update(r):e});return e.update({groups:s})}function unsafeComputeView(e,t){switch(!0){case isElementView$1(e):return computeElementView(t,e);case isDeploymentView$1(e):return computeDeploymentView(t,e);case isDynamicView$1(e):return computeDynamicView(t,e);default:nonexhaustive(e)}}function computeView(e,t){try{return{isSuccess:!0,view:unsafeComputeView(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function resolveRulesExtendedViews(e){let t=new Ft({type:`directed`}),r=[];for(let s of Fe(e))t.addNode(s.id,{view:s}),isExtendsElementView(s)&&r.push(s);if(r.length===0)return e;for(let e of r){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,ha.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,ma.topologicalSort)(t).reverse().reduce((e,r)=>{let s=t.getNodeAttribute(r,`view`);if(!isExtendsElementView(s))return e[s.id]=s,e;let c=e[s.extends];if(!c||!isElementView$1(c))return e;let u=le([...c.tags??[],...s.tags??[]]),d=[...c.links??[],...s.links??[]];return e[s.id]={...c,...s,title:s.title??c.title??null,description:s.description??c.description??null,tags:u,links:isNonEmptyArray(d)?d:null,rules:[...c.rules,...s.rules]},e},{})}const keysCount=e=>d(e).length,Gu=t(e=>stringHash$1(e),`nodeId`);function computeProjectsView(e){let t=buildNodesForEachModel(e),key=(e,t)=>`${e}->${t}`,r=new L.default(e=>{let[t,r]=e.split(`->`);return{from:t,to:r,relationships:new Set}}),relationshipsFromTo=(e,t)=>r.get(key(e,t)).relationships,processImportedElement=(e,t)=>{let r=t.projectId;invariant(r!==e.projectId,`Imported element must have a different project id`);let s=relationshipsFromTo(e.projectId,r);for(let r of t.incoming(`direct`))r.source.projectId===e.projectId&&s.add(r);let c=relationshipsFromTo(r,e.projectId);for(let r of t.outgoing(`direct`))r.target.projectId===e.projectId&&c.add(r)};for(let t of e)if(!j(t.$data.imports))for(let[e,r]of Re(t.$data.imports))for(let s of r){let r=GlobalFqn(e,s.id);processImportedElement(t,nonNullable(t.findElement(r),`Element ${s.id} from project ${e} not found in model ${t.projectId}`))}let s=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:r,relationships:s}])=>{let c=[...s];invariant(P(c,1),`Relationships set must have at least one relationship`);let u={id:stringHash$1(e),source:Gu(t),target:Gu(r),projectId:t,relations:D(c,M(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:le(I(c,M(`tags`)))},d=A(c);return d&&(u.label=d.title,u.description=preferSummary(d.$relationship)??null,u.technology=d.technology,u.color=d.color,u.line=d.line,d.kind&&(u.kind=d.kind),d.$relationship.navigateTo&&(u.navigateTo=d.$relationship.navigateTo)),u});linkNodesWithEdges(t,s);let c=topologicalSort$1({nodes:t,edges:s});return{id:`projects-view`,[zi]:`projects`,[Ri]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...c}}function buildNodesForEachModel(e){let t=new Map;for(let r of e){let e=ProjectId(r.projectId),s={id:Gu(e),kind:`@project`,parent:null,projectId:e,title:r.project.title??r.project.id,description:{txt:[`Elements: ${keysCount(r.$data.elements)}`,`Relationships: ${keysCount(r.$data.relations)}`,`Views: ${keysCount(r.$data.views)}`].join(`
78
- `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(s.id,s)}return t}function computeAdhocView(e,t){return{...computeElementView(e,{id:ViewId(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}$n();const Ku=Y.getChild(`LanguageServices`),qu=t(e=>e.severity===Zn.Error,`isErrorDiagnostic`);var DefaultLikeC4LanguageServices=class{services;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}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=N(this.services.shared.workspace.LangiumDocuments.groupedByProject(),Re(),D(([t,r])=>{let s=t,{folderUri:c,config:u}=e.getProject(s);return{id:s,folder:c,title:u.title??u.name,documents:D(r,M(`uri`)),config:u}}));if(P(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(P(t,1))return t;let{id:r,folderUri:s,config:c}=e.default;return[{id:r,folder:s,title:c.title??c.name,documents:[],config:c}]}project(e){let{id:t,folderUri:r,config:s}=this.projectsManager.ensureProject(e),c=D(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),M(`uri`));return{id:t,folder:r,title:s.title??s.name,documents:c,config:s}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),s=await this.builder.computeModel(r,t);if(!s)throw Error(`Failed to compute model, empty project?`);let c=await this.views.layoutAllViews(r,t);return Ea.create({...s.$data,_stage:`layouted`,views:N(c,D(M(`diagram`)),Pe(M(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let s of t){let t=await this.builder.computeModel(s,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Ea.EMPTY){Ku.debug(`Project ${s} is empty, skipping`);continue}r.push(t)}if(!P(r,1))throw Error(`No models found`);let s=computeProjectsView(r);return await this.views.layouter.layoutProjectsView(s)}getErrors(){return N(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),I(e=>N(e.diagnostics??[],F(qu),D(({message:t,range:r})=>({message:t,line:r.start.line,range:r,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:nonexhaustive(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,s=buildFormattingOptions(e),c=this.collectDocumentsToFormat(t,e);c.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let u=new Map;for(let e of c){let t=e.uri.toString(),c=await r.formatDocument(e,{options:s,textDocument:{uri:t}}),d=c.length===0?e.textDocument.getText():Jt.applyEdits(e.textDocument,c);u.set(t,d)}return u}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],s=t?.documentUris??[],c=new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))c.set(r.uri.toString(),r);else if(s.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))c.set(r.uri.toString(),r);for(let t of s){if(c.has(t))continue;let r;try{r=e.getDocument(R.parse(t))}catch{Ku.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(r)){Ku.warn(`format: skipping unknown document ${t}`);continue}c.set(t,r)}return[...c.values()]}async dispose(){try{Ku.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Ku.error(loggable(e))}finally{Ku.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(isLikeC4LangiumDocument(e))return e.state<Kt.Linked&&(Y.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Kt.Linked,e.uri,r),Y.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Vl.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let s=projectIdFrom(e);return{range:{start:r.start,end:{line:r.start.line,character:r.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,s],title:`open preview`}}})}};$n();function isCompletionForPojectName(e,t){return An(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const Ju=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
76
+ `):void 0}default:return e}}catch(e){logWarnError(e)}}};function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(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 isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}function isSameLine(e,t){if(!e||!t)return!1;let[r,s]=e.range.start.line<t.range.start.line?[e,t]:[t,e];return r.range.end.line===s.range.start.line}const Q={newLine:yn.newLine({allowMore:!0}),oneSpace:yn.oneSpace(),noSpace:yn.noSpace(),indent:yn.indent({allowMore:!0}),noIndent:yn.noIndent()};var LikeC4Formatter=class extends Gn{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let s=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(s),s}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.formatSteps(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let r=Cn(e.$cstNode,`values`).filter(x).slice(1);t.cst(r).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...M([e.target,e.tags],x)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...M([e.target,e.tags],x)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,isStepOrSeries,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(isStepSeries(e)&&isMultiline(e.$cstNode)||isStep(e)&&isStepSeries(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(yn.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(yn.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isStepsBlock(e)||isAltSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(Q.noIndent).prepend(Q.oneSpace);let s=isMultiline(e.$cstNode),c=t.keywords(`}`),u=t.interior(r,c),d=null;for(let e of u.nodes){if(!s){t.cst([e]).surround(Q.oneSpace);continue}(!d||!areOverlap(d,e))&&t.cst([e]).prepend(yn.newLine({allowMore:!0})).prepend(Q.indent),d=e}s?c.prepend(Q.noIndent).prepend(yn.newLine({allowMore:!0})):c.prepend(yn.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,isElementView,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,isDynamicView)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,isDeploymentView)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),s=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);r.nodes.length===0?s.append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=Vt(e.$cstNode,`kind`),s=Vt(e.$cstNode,`name`);s&&r&&(compareRanges(s,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([s]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElementOrRelation,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode,(e,t)=>{let r=Vt(e.$cstNode,`kind`),s=Vt(e.$cstNode,`name`);s&&r&&(compareRanges(s,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([s]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),s=r?.$cstNode&&isMultiline(r?.$cstNode);s&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(s?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}formatSteps(e){this.on(e,isAnyOf(isAltSteps,isTryBlock,isCatchBlock,isFinallyBlock),(e,t)=>{if(t.keywords(`try`,`alt`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace),isCatchBlock(e)){let r=t.keyword(`catch`);isSameLine(e.try.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(yn.newLine()),r.append(Q.oneSpace)}if(isFinallyBlock(e)){let r=t.keyword(`finally`);isSameLine(e.tryCatch.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(yn.newLine()),r.append(Q.oneSpace)}}),this.on(e,isSubflowStep,(e,t)=>{t.property(`kind`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let s=t(e)?this.getNodeFormatter(e):void 0;try{r&&s&&r(e,s)}catch(t){Y.warn(`Error formatting node ${e.$type}`,{error:t})}return s}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:nonexhaustive(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isStepStatement)?.properties(`title`),t??=this.on(e,isDeploymentNode)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.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,r)=>{let s=t===`single`?`"`:`'`,c=t===`single`?`'`:`"`,u=c.repeat(3),d=c,p=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?u:d;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),s,c)+t}});r.push(...p)}}escapeQuotesInternalQuotes(e,t,r){let s=``,c=0;for(;c>=0;){let t=e.indexOf(r,c);if(t<0){s+=e.slice(c);break}s+=e.slice(c,t),c=t+1;let u=!1;for(;t>0&&e[t-1]==`\\`;)u=!u,t--;s+=u?r:`\\${r}`}return s}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 ancestorsOfNode(e,t){let r=[],s=e.parent;for(;s;){let e=nonNullable(t.get(s),`Parent node ${s} not found`);r.push(e),s=e.parent}return r}function linkNodesWithEdges(e,t){for(let r of t){let t=e.get(r.source),s=e.get(r.target);invariant(t,`Source node ${r.source} not found`),invariant(s,`Target node ${r.target} not found`),t.outEdges.push(r.id),s.inEdges.push(r.id);let c=ancestorsOfNode(t,e),u=ancestorsOfNode(s,e),d=c.length>0&&u.length>0?ke(commonHead(Se(c),Se(u))):null;r.parent=d?d.id:null;for(let e of c){if(e===d)break;e.outEdges.push(r.id)}for(let e of u){if(e===d)break;e.inEdges.push(r.id)}}}function elementExprToPredicate(e){if(q.isCustom(e))return elementExprToPredicate(e.custom.expr);if(q.isWhere(e)){let t=elementExprToPredicate(e.where.expr),r=whereOperatorAsPredicate(e.where.condition);return e=>t(e)&&r(e)}if(q.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(q.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(q.isWildcard(e))return()=>!0;if(q.isModelRef(e)){let t=G.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||parentFqn(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}nonexhaustive(e)}function createRelationExpressionToPredicates(e){return function relationExpressionToPredicates(t){switch(!0){case Xi.isCustom(t):return relationExpressionToPredicates(t.customRelation.expr);case Xi.isWhere(t):{let e=relationExpressionToPredicates(t.where.expr),r=whereOperatorAsPredicate(t.where.condition);return t=>e(t)&&r({source:{tags:t.source.tags,kind:t.source.kind,metadata:t.source.metadata},target:{tags:t.target.tags,kind:t.target.kind,metadata:t.target.metadata},...t.tags&&{tags:t.tags},...t.kind&&{kind:t.kind},...t.metadata&&{metadata:t.metadata}})}case Xi.isDirect(t):{let r=e(t.source),s=e(t.target);return e=>r(e.source)&&s(e.target)||!!t.isBidirectional&&r(e.target)&&s(e.source)}case Xi.isInOut(t):{let r=e(t.inout);return e=>r(e.source)||r(e.target)}case Xi.isIncoming(t):{let r=e(t.incoming);return e=>r(e.target)}case Xi.isOutgoing(t):{let r=e(t.outgoing);return e=>r(e.source)}default:nonexhaustive(t)}}}const Du=createRelationExpressionToPredicates(elementExprToPredicate);function ensureParentsFirst(e){let t=[],r=[...e],s;for(;s=r.shift();){let e=s.parent;if(e){let s=[];for(;e;){let t=r.findIndex(t=>t.id===e);if(t<0)break;let[c]=r.splice(t,1);if(!c)throw Error(`Invalid state, should not happen`);s.unshift(c),e=c.parent}t.push(...s)}t.push(s)}return t}function updateChildren(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,r)=>(r.parent===t.id&&e.push(r.id),e),[]))}),e}function topologicalSort$1(e){let t=ensureParentsFirst([...e.nodes.values()]),r=[...e.edges];if(t.length<2||r.length===0)return{nodes:t,edges:r};let getNode=t=>nonNullable(e.nodes.get(t)),s=new Lt({multi:!0,allowSelfLoops:!0,type:`directed`}),[c,u]=Xe(k(r,w(e=>{let t=getNode(e.source),r=getNode(e.target),s=e.parent?getNode(e.parent):null;return{id:e.id,edge:e,parent:s,source:t,target:r}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),d=[],addEdgeToGraph=e=>{s.mergeNode(e.source),s.mergeNode(e.target),d.push(e),(0,Oa.default)(s,e.source,e.target)||s.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:r,target:u}of c)if(addEdgeToGraph(t),u.parent&&u.parent!==t.parent&&k(ancestorsOfNode(u,e.nodes),He(e=>e.inEdges.includes(t.id)),Ve(e=>{s.mergeNode(e.id),(0,Oa.default)(s,t.source,e.id)||s.mergeDirectedEdge(t.source,e.id),(0,Oa.default)(s,e.id,t.target)||s.mergeDirectedEdge(e.id,t.target)})),r.parent){let e=getNode(r.parent);s.mergeNode(e.id),(0,Oa.default)(s,e.id,r.id)||s.mergeDirectedEdge(e.id,r.id),u.parent&&u.parent!==r.parent&&((0,Oa.default)(s,e.id,u.parent)||s.mergeDirectedEdge(e.id,u.parent))}for(let{edge:e}of u)addEdgeToGraph(e);invariant(d.length===r.length,`Not all edges were added to the graph`);let p=(0,Da.topologicalSort)(s),m=[],h=t.slice();for(let e of p){let t=h.findIndex(t=>t.id===e);invariant(t>=0,`Node "${e}" not found`),m.push(...h.splice(t,1))}return h.length>0&&m.length>0&&(m=m.flatMap(e=>{if(h.length===0)return e;let r=t.slice(0,t.indexOf(e)).filter(e=>h.includes(e));return r.length>0?(h=h.filter(e=>!r.includes(e)),[...r,e]):e})),m.push(...h),{nodes:updateChildren(ensureParentsFirst(m)),edges:d}}r(topologicalSort$1,`topologicalSort`);function calcViewLayoutHash(e){return e.hash=objectHash({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:k(e.nodes,w(e=>({id:e.id,icon:x(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:flattenMarkdownOrString(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconColor:e.style.iconColor??null,iconPosition:e.style.iconPosition??null,border:e.style.border??null,opacity:e.style.opacity??null,multiple:e.style.multiple??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),m(({id:e,...t})=>[e,t])),edges:k(e.edges,w(e=>({id:e.id,source:e.source,target:e.target,label:e.label,description:flattenMarkdownOrString(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),m(e=>[e.id,{...e}]))}),e}var AbstractMemory=class{state;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}},AbstractStageExclude=class{memory;expression;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(isIterable(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(ee(t)&&(invariant(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),isIterable(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=difference(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=intersection(t,e.elements),t=k(t,ifilter(t=>e.explicits.has(t)&&!isome(e.final,isDescendantOf(t))),toSet()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=difference(e.explicits,t),e.final=difference(e.final,t)),e}removeElements(e){return e.elements=difference(e.elements,this.excluded.elements),e.explicits=difference(e.explicits,this.excluded.elements),e.final=difference(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let r=e.get(t.id);return r?e.set(t.id,r.mergeWith(t)):e.set(t.id,t),e},new Map),r=new Set;e.connections=e.connections.reduce((e,s)=>{let c=t.get(s.id);if(c){r.add(s.source),r.add(s.target);let t=s.difference(c);t.nonEmpty()&&e.push(t)}else e.push(s);return e},[]);for(let t of e.connections)r.delete(t.source),r.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&r.delete(t.boundary);return r.size===0?e:(r=difference(r,e.explicits),e.final=difference(e.final,r),e)}precommit(e){return e}postcommit(e){return invariant(difference(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),invariant(difference(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,...findAscendingConnections(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))}},AbstractStageInclude=class{memory;expression;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 mergeConnections([...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(isIterable(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(isIterable(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(isIterable(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[r,s]=Xe(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(mergeConnections([...e.connections,...r,...s])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=union(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=intersection(e.elements,union(e.explicits,this.explicits)),e.final=intersection(e.elements,union(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function treeFromMemoryState(e,t=`final`){let r=sortParentsFirst(toArray(t===`final`?e.final:e.elements)),s=new Set(e.connections.flatMap(e=>[e.source,e.target])),c=new Set(r),u=new P.default(()=>null),d=r.reduce((e,t,r,s)=>(e.set(t,s.slice(r+1).filter(e=>isAncestor(t,e)).map(e=>(c.delete(e),e)).reduce((e,r)=>(e.some(e=>isAncestor(e,r))||(e.push(r),u.set(r,t)),e),[])),e),new P.default(()=>[]));return{root:c,connected:s,hasInOut:t=>e.connections.some(Ba.isAnyInOut(t.id)),parent:e=>u.get(e),children:e=>d.get(e)}}var StageExclude$1=class extends AbstractStageExclude{static{r(this,`StageExclude`)}};function applyViewRuleStyle(e,t,r){let{shape:s,color:c,icon:u,...p}=e.style,m=!E(p);k(r,M(d(isGroupElementKind)),M(t),Ve(t=>{t.shape=s??t.shape,t.color=c??t.color,_(u)&&(t.icon=u),_(e.notation)&&(t.notation=e.notation),m&&(t.style={...t.style,...p})}))}function applyViewRuleStyles(e,t){for(let r of e)!isViewRuleStyle$1(r)||r.targets.length===0||applyViewRuleStyle(r,ge(r.targets.map(elementExprToPredicate)),t);return t}var Ou=class NodesGroup{id;viewRule;parent;elements;static kind=qi;constructor(e,t,r=null,s=new Set){this.id=e,this.viewRule=t,this.parent=r,this.elements=s}isEmpty(){return this.elements.size===0}update(e){return new NodesGroup(this.id,this.viewRule,this.parent,e)}clone(){return new NodesGroup(this.id,this.viewRule,this.parent,new Set(this.elements))}},StageExclude=class extends AbstractStageExclude{excludeRelations(e){return k(this.memory.connections,M(t=>hasIntersection(t.relations,e)),Ve(t=>{this.excludeConnections(t.update(intersection(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=difference(this.memory.explicits,e.explicits);for(let r of t)e.explicitFirstSeenIn.delete(r);let r=difference(this.memory.elements,e.elements);for(let t of r)e.lastSeenIn.delete(t);return e}},ActiveGroupStageExclude=class extends StageExclude{memory;expression;constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:ku,findConnectionsBetween:Au}=Ga;var StageInclude$1=class extends AbstractStageInclude{static{r(this,`StageInclude`)}connectWithExisting(e,t=`both`){let r=this._connections.length,hasChanged=()=>this._connections.length>r;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(ku(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Au(e,this.memory.elements,`directed`)),hasChanged()}let s=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Au(e,s,`directed`));if(t===`out`||t===`both`)for(let e of s)this.addConnections(Au(e,this.memory.elements,`directed`));return hasChanged()}addImplicitWithinScope(e){e&&(!this.memory.scope||isAncestor(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return Zi.isRelationExpr(this.expression)||k(e,Ve(({source:e,target:t,boundary:r})=>{k(We([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),Ce(([e,t])=>e===t),_e(1),Ve(([s,c])=>{if(s===e&&c===t){this.addImplicitWithinScope(r);return}s!==e&&this.addImplicitWithinScope(s),c!==t&&this.addImplicitWithinScope(c)}))})),e}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let r of t)e.explicitFirstSeenIn.set(r,`@root`);return e}},ActiveGroupStageInclude=class extends StageInclude$1{memory;expression;constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let r of t)e.explicitFirstSeenIn.set(r,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},ju=class Memory$1 extends AbstractMemory{static{r(this,`Memory`)}state;scope;static empty(e){return new Memory$1({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},e)}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 StageInclude$1(this,e)}stageExclude(e){return new StageExclude(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(e){return new Memory$1({...this.state,...e},this.scope)}},Mu=class ActiveGroupMemory extends ju{state;scope;stack;static enter(e,t){let r=`@gr${e.groups.length+1}`;if(e instanceof ActiveGroupMemory){let s=st.default.from([...e.stack].reverse()),c=e.mutableState();return c.groups.push(new Ou(r,t,e.activeGroupId)),s.push(r),new ActiveGroupMemory(c,e.scope,s)}let s=e.mutableState();s.groups.push(new Ou(r,t,null));let c=st.default.of(r);return new ActiveGroupMemory(s,e.scope,c)}constructor(e,t,r){super(e,t),this.state=e,this.scope=t,this.stack=r}get activeGroupId(){return nonNullable(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(e){let t={...this.state,...e};return new ActiveGroupMemory(t,this.scope,this.stack)}stageInclude(e){return new ActiveGroupStageInclude(this,e)}stageExclude(e){return new ActiveGroupStageExclude(this,e)}leave(){let e=this.mutableState();return this.stack.pop(),this.stack.peek()?new ActiveGroupMemory(e,this.scope,this.stack):new ju(e,this.scope)}};function updateDepthOfAncestors(e,t){let r;for(;e.parent&&(r=t.get(e.parent));){let t=r.depth??1;if(r.depth=Math.max(t,(e.depth??0)+1),r.depth===t)break;e=r}}function elementModelToNodeSource(e){let{id:t,title:r,...s}=oe(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:c,icon:u,shape:d,...p}=e.style;return exact({id:t,title:r,modelRef:t,shape:d,color:c,icon:u,style:p,description:preferSummary(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...s})}function buildComputedNodes({defaults:e},t,r){let s=new Map,c=new Map;r?.forEach(({id:t,parent:r,viewRule:u,elements:d})=>{r&&nonNullable(s.get(r),`Parent group node ${r} not found`).children.push(t),s.set(t,{id:t,parent:r,kind:qi,title:u.title??``,color:u.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:exact({border:u.border??e.group.border,opacity:u.opacity??e.group.opacity,size:u.size,multiple:u.multiple,padding:u.padding,textSize:u.textSize})});for(let e of d)c.set(e.id,t)}),Array.from(t).sort(compareByFqnHierarchically).forEach(({id:e,...t})=>{let r=parentFqn(e),u=0,d;for(;r&&(d=s.get(r),!d);)r=parentFqn(r);let p=t.modelRef??e;if(!d&&c.has(p)){let e=nonNullable(c.get(p));d=s.get(e),r=e}d&&(d.children.length==0&&(d.depth=1,updateDepthOfAncestors(d,s)),d.children.push(e),u=d.level+1);let m=exact({id:e,parent:r,level:u,children:[],inEdges:[],outEdges:[],...t});s.set(e,m)});let u=new Map;return r?.forEach(({id:e})=>{u.set(e,nonNullable(s.get(e)))}),t.forEach(({id:e})=>{u.set(e,nonNullable(s.get(e)))}),u}function pickRelationshipProps(e){let{title:t,description:r=null}=e;return{...t&&{title:t,description:r},...he(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function mergePropsFromRelationships(e,t){let r=k(e,Re((e,t)=>(x(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),x(t.description)&&!e.description.some(le(t.description))&&e.description.push(t.description),x(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),x(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),x(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),x(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),x(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),x(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),x(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:[]})),s=T(r.title)??(r.title.length>1?`[...]`:void 0),c=pe(r.tags),u=exact({title:s,description:T(r.description),technology:T(r.technology),kind:T(r.kind),head:T(r.head),tail:T(r.tail),color:T(r.color),line:T(r.line),navigateTo:T(r.navigateTo),...isNonEmptyArray(c)&&{tags:c}});if(t){let e=pickRelationshipProps(t);u=Qe({...u,...e},x)}return N(u.title)&&x(u.technology)&&(u.title=`[${u.technology}]`,delete u.technology),u}const{findConnection:Nu,findConnectionsBetween:Pu,findConnectionsWithin:Fu}=Wa;function resolveElements$1(e,t){let r=e.element(t.ref.deployment);if(r.isDeploymentNode()){if(t.selector===`children`)return[...r.children()];if(t.selector===`expanded`)return[r,...r.children()];if(t.selector===`descendants`)return[...r.descendants()]}return[r]}r(resolveElements$1,`resolveElements`);function resolveModelElements(e,t){let r=e.$model.element(t.ref.model);return t.selector===`children`?[...r.children()]:t.selector===`expanded`?[r,...r.children()]:t.selector===`descendants`?[...r.descendants()]:[r]}function deploymentExpressionToPredicate(e){if(K.isWildcard(e))return()=>!0;if(K.isElementTagExpr(e)||K.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(K.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return r=>r.id===t||r.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>parentFqn(e.id)===t:e=>e.id===t}if(K.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return r=>{let s=r.modelRef??null;return!s||s===t||s.startsWith(e)}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let r=t.modelRef??null;return!r||r.startsWith(e)}}return e.selector===`children`?e=>{let r=e.modelRef??null;return!r||parentFqn(r)===t}:e=>{let r=e.modelRef??null;return!r||r===t}}nonexhaustive(e)}function instanceSummary(e){return preferSummary(e.$instance)??preferSummary(e.element.$element)}function deploymentNodeToNodeSource(e){let t=e.id,r=e.onlyOneInstance();return exact({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:j(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:r?.element.id,icon:e.style.icon,description:preferSummary(e.$node)??void 0,tags:[...e.tags],style:oe(e.style,[`icon`,`shape`,`color`])})}function instanceToNodeSource(e){let t=e.$instance,r=e.element,{icon:s,color:c,shape:u,...d}=e.style,p=[...r.links,...t.links??[]];return exact({id:e.id,kind:`instance`,title:e.title,description:instanceSummary(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:j(p,1)?p:void 0,icon:s,color:c,shape:u,style:d,deploymentRef:t.id,modelRef:r.id,notation:t.notation})}function toNodeSource(e){return e.isInstance()?instanceToNodeSource(e):deploymentNodeToNodeSource(e)}const Iu=r((e,t,r)=>stringHash$1(`model:${e}:${t}:${r}`),`hashEdgeId`);function mergeBidirectionalEdges(e){let t=new Set;for(let r=0;r<e.length;r++){if(t.has(r))continue;let s=e[r];for(let c=r+1;c<e.length;c++){if(t.has(c))continue;let r=e[c];if(s.source===r.target&&s.target===r.source&&s.label===r.label){s.dir=`both`;let e=s.head??r.head;e&&(s.head||=e,s.tail||=e),r.color&&(s.color||=r.color),r.line&&(s.line||=r.line),t.add(c);break}}}return t.size>0?e.filter((e,r)=>!t.has(r)):e}function toComputedEdges$1(e,t){let r=[],s=[];for(let c of e){let e=[...c.relations.model,...c.relations.deployment];invariant(j(e,1),`Edge must have at least one relation`);let u=c.source.$model.$styles.defaults,d=c.source.id,p=c.target.id;if(t&&e.length>1){let[m,h]=k(e,Xe(e=>t(e,c)));if(m.length>0){for(let e of m){let{title:t,color:s=u.relationship.color,line:m=u.relationship.line,head:h=u.relationship.arrow,...g}=mergePropsFromRelationships([e.$relationship],e.$relationship);r.push({id:Iu(d,p,e.id),parent:c.boundary?.id??null,source:d,target:p,label:t??null,relations:[e.id],color:s,line:m,head:h,...g})}if(h.length>0){let e=T(M(h,e=>e.source.id===d&&e.target.id===p)),{title:t,color:r=u.relationship.color,line:m=u.relationship.line,head:g=u.relationship.arrow,..._}=mergePropsFromRelationships(h.map(e=>e.$relationship),e?.$relationship);s.push({id:c.id,parent:c.boundary?.id??null,source:d,target:p,label:t??null,relations:h.map(e=>e.id),color:r,line:m,head:g,..._})}continue}}let{title:m,color:h=u.relationship.color,line:g=u.relationship.line,head:_=u.relationship.arrow,...v}=mergePropsFromRelationships(e.map(e=>e.$relationship)),y=exact({id:c.id,parent:c.boundary?.id??null,source:d,target:p,label:m??null,relations:e.map(e=>e.id),color:h,line:g,head:_,...v});s.push(y)}return[...r,...mergeBidirectionalEdges(s)]}r(toComputedEdges$1,`toComputedEdges`);function buildNodes$1(e,t){let r=buildComputedNodes(e.$styles,[...t.final].map(toNodeSource));for(let t of r.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let r=e.deployment.element(t.deploymentRef),s=r.isDeploymentNode()&&r.onlyOneInstance();if(!s)continue;t.title===r.name&&(t.title=s.title),t.description??=instanceSummary(s)??null,t.technology??=s.technology,E(t.tags)&&(t.tags=[...s.tags]),(!t.links||E(t.links))&&j(s.links,1)&&(t.links=[...s.links]);let c=e.$styles.defaults;t.shape===c.shape&&t.shape!==s.shape&&(t.shape=s.shape,t.notation=null),t.color===c.color&&t.color!==s.color&&(t.color=s.color,t.notation=null),!t.icon&&s.icon&&(t.icon=s.icon)}return r}r(buildNodes$1,`buildNodes`);function applyDeploymentViewRuleStyles(e,t){for(let r of e)!isViewRuleStyle$1(r)||r.targets.length===0||applyViewRuleStyle(r,ge(r.targets.map(deploymentExpressionToPredicate)),t);return t}function findCrossBoundarySameSourceOrTarget(e){let t=new P.default(()=>[]);for(let r of e)for(let e of r.relations.model)t.get(e).push(r);let r=new P.default(()=>new Set);for(let[e,s]of t)j(s,2)&&k(s,A(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),re(D(`group`)),Be(),M(j(2)),Ve(qe(w(D(`conn`)),sortConnectionsByBoundaryHierarchy(`desc`),Ce((e,t,r)=>t===0||e.boundary===r[t-1].boundary),Ve(t=>{r.get(t).add(e)}))));return r}function findCrossBoundaryConnections(e){e=mergeConnections(e);let t=findCrossBoundarySameSourceOrTarget(e);for(let r of e){let{source:e,target:s}=r,c=r.relations.model;if(e.isDeploymentNode()!==s.isDeploymentNode()){let s=e.isDeploymentNode()?e:r.target;invariant(s.isDeploymentNode());let u=intersection(c,s.internalModelRelationships());for(let e of u)t.get(r).add(e);continue}if(e.isDeploymentNode()&&s.isDeploymentNode()){let c=union(intersection(r.relations.model,e.internalModelRelationships()),intersection(r.relations.model,s.internalModelRelationships()));for(let e of c)t.get(r).add(e)}}return k(t.entries(),imap(([e,t])=>e.update({model:t,deployment:null})),toArray())}function cleanCrossBoundary(e){return differenceConnections(e,findCrossBoundaryConnections(e))}function findRedundantConnections$1(e){return k(e,mergeConnections,Re((t,r)=>{let{source:s,target:c,relations:u}=r;if(s.isInstance()&&c.isInstance())return t;let d=La.empty();if(s.isDeploymentNode()&&c.isDeploymentNode()){let[e]=Nu(c,s,`directed`);e&&(d=u.intersect(e.relations))}for(let t of e)isNestedConnection(t,r)&&(d=d.union(u.intersect(t.relations)));return d.nonEmpty&&t.push(new Ha(s,c,d)),t},[]))}r(findRedundantConnections$1,`findRedundantConnections`);function cleanRedundantRelationships(e){return differenceConnections(e,findRedundantConnections$1(e))}var StageInclude=class extends AbstractStageInclude{connectWithExisting(e,t=`both`){let r=this._connections.length,hasChanged=()=>this._connections.length>r;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Nu(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Pu(e,this.memory.elements,`directed`)),hasChanged()}let s=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Pu(e,s,`directed`));if(t===`out`||t===`both`)for(let e of s)this.addConnections(Pu(e,this.memory.elements,`directed`));return hasChanged()}processConnections(e){let t=k(e,cleanCrossBoundary,cleanRedundantRelationships);return k(t,Ve(({source:e,target:t,boundary:r})=>{k(We([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),Ce(([e,t])=>e===t),_e(1),Ve(([s,c])=>{if(e===s&&t===c){this.addImplicit(r);return}s!==e&&s.isDeploymentNode()&&!s.onlyOneInstance()&&this.addImplicit(s),c!==t&&c.isDeploymentNode()&&!c.onlyOneInstance()&&this.addImplicit(c)}))})),t}},Lu=class Memory extends AbstractMemory{static empty(){return new Memory({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new StageInclude(this,e)}stageExclude(e){return new StageExclude$1(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(e){return new Memory({...this.state,...e})}equals(e){return e instanceof Memory&&le(this.state,e.state)}diff(e){return{added:{elements:toArray(difference(e.elements,this.elements)),explicits:toArray(difference(e.explicits,this.explicits)),final:toArray(difference(e.final,this.final)),connections:toArray(differenceConnections(e.connections,this.connections))},removed:{elements:toArray(difference(this.elements,e.elements)),explicits:toArray(difference(this.explicits,e.explicits)),final:toArray(difference(this.final,e.final)),connections:differenceConnections(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
77
+ `)}[Va](e,t,r){return this.toString()}};const Ru={include:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c}))},exclude:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c}))}},zu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.incoming)){for(let e of u){if(e.allOutgoing.isEmpty)continue;let t=applyPredicate(Pu(e,[...resolveAscendingSiblings(e)],`directed`),c);s.addConnections(t)}return s}invariant(K.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.incoming);for(let e of u){let t=applyPredicate(Pu(e,d,`directed`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.incoming)||K.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.incoming))return excludeModelRelations(resolveAllIncomingRelations(t,e.incoming),{stage:s,memory:r},c);if(K.isWildcard(e.incoming))return s;let u=filterIncomingConnections(resolveElements$1(t,e.incoming)),d=k(r.connections,M(u),applyPredicate(c));return s.excludeConnections(d),s}};function filterIncomingConnections(e){return ge(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>!satisfies(e.source)&&satisfies(e.target)}))}function resolveAllIncomingRelations(e,t){let r=resolveModelElements(e,t);return new Set(r.flatMap(e=>[...e.allIncoming]))}const Bu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.outgoing)){for(let e of u)if(!e.allIncoming.isEmpty)for(let t of resolveAscendingSiblings(e)){let r=applyPredicate(Nu(t,e,`directed`),c);s.addConnections(r)}return s}invariant(K.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.outgoing);for(let e of d){let t=applyPredicate(Pu(e,u,`directed`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.outgoing)||K.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.outgoing))return excludeModelRelations(resolveAllOutgoingRelations(t,e.outgoing),{stage:s,memory:r},c);if(K.isWildcard(e.outgoing))return s;let u=filterOutgoingConnections(resolveElements$1(t,e.outgoing)),d=k(r.connections,M(u),applyPredicate(c));return s.excludeConnections(d),s}};function filterOutgoingConnections(e){return ge(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>satisfies(e.source)&&!satisfies(e.target)}))}function resolveAllOutgoingRelations(e,t){let r=resolveModelElements(e,t);return new Set(r.flatMap(e=>[...e.allOutgoing]))}const Vu={include:({expr:{source:e,target:t,isBidirectional:r=!1},model:s,stage:c,where:u})=>{if(K.isElementTagExpr(e)||K.isElementKindExpr(e)||K.isElementTagExpr(t)||K.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);invariant(!K.isModelRef(e),`Invalid source model ref in direct relation`),invariant(!K.isModelRef(t),`Invalid target model ref in direct relation`);let d=K.isWildcard(e),p=K.isWildcard(t),m=r?`both`:`directed`,h;switch(!0){case d&&p:h=k(Fu(s.instances()),applyPredicate(u),w(e=>(c.addImplicit(e.boundary),e)));break;case!d&&p:{let t=resolveElements$1(s,e),c=filterOutgoingConnections(t),postFilter=c;if(r){let e=filterIncomingConnections(t);postFilter=t=>c(t)!==e(t)}h=k(t,A(e=>Pu(e,resolveAscendingSiblings(e),m)),M(postFilter),applyPredicate(u));break}case d&&!p:{let e=resolveElements$1(s,t),c=filterIncomingConnections(e),postFilter=c;if(r){let t=filterOutgoingConnections(e);postFilter=e=>t(e)!==c(e)}h=k(e,A(e=>[...resolveAscendingSiblings(e)].flatMap(t=>Nu(t,e,m))),M(postFilter),applyPredicate(u));break}default:{invariant(!d,`Inference failed - source should be a deployment ref`),invariant(!p,`Inference failed - target should be a deployment ref`);let r=resolveElements$1(s,e),c=resolveElements$1(s,t),g=filterOutgoingConnections(r),_=filterIncomingConnections(c);h=k(r,A(e=>Pu(e,c,m)),M(e=>g(e)&&_(e)),applyPredicate(u))}}return c.addConnections(h),K.isDeploymentRef(e)&&ce(e.selector)&&c.addImplicit(s.element(e.ref.deployment)),K.isDeploymentRef(t)&&ce(t.selector)&&c.addImplicit(s.element(t.ref.deployment)),c},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=deploymentExpressionToPredicate(e.target),d=deploymentExpressionToPredicate(e.source),p;switch(!0){case K.isWildcard(e.source)&&K.isWildcard(e.target):return s.excludeConnections(applyPredicate(r.connections,c)),s;case K.isModelRef(e.source)&&K.isModelRef(e.target):return p=resolveRelationsBetweenModelElements({source:e.source,target:e.target,expr:e,model:t}),excludeModelRelations(p,{stage:s,memory:r},c);case K.isModelRef(e.source)&&K.isWildcard(e.target):return p=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(p,{stage:s,memory:r},c);case K.isModelRef(e.source):return p=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(p,{stage:s,memory:r},c,e=>u(e.target));case K.isModelRef(e.target):return p=resolveAllIncomingRelations(t,e.target),excludeModelRelations(p,{stage:s,memory:r},c,e=>d(e.source));default:let satisfies=t=>d(t.source)&&u(t.target)||e.isBidirectional===!0&&d(t.target)&&u(t.source),m=k(r.connections,M(satisfies),applyPredicate(c));return m.length===0||s.excludeConnections(m),s}}};function resolveRelationsBetweenModelElements({source:e,target:t,expr:r,model:s}){let c=resolveModelElements(s,e),u=resolveModelElements(s,t),d=r.isBidirectional?`both`:`directed`,p=[];for(let e of c)p.push(...findConnectionsBetween$3(e,u,d));return new Set(p.flatMap(e=>[...e.relations]))}const Hu={include:({expr:e,model:t,memory:r,stage:s,where:c})=>{let u=[...r.elements];if(K.isWildcard(e.inout)){for(let e of u){let t=matchConnections(Pu(e,[...resolveAscendingSiblings(e)],`both`),c);s.addConnections(t)}return s}invariant(K.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let d=resolveElements$1(t,e.inout);for(let e of u){let t=matchConnections(Pu(e,d,`both`),c);s.addConnections(t)}return s},exclude:({expr:e,model:t,memory:r,stage:s,where:c})=>{if(K.isElementTagExpr(e.inout)||K.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(K.isModelRef(e.inout)){let u=resolveModelElements(t,e.inout);return u.length===0?s:excludeModelRelations(union(new Set,...u.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:s,memory:r},c)}if(K.isWildcard(e.inout))return s;let u=resolveElements$1(t,e.inout),d=filterIncomingConnections(u),p=filterOutgoingConnections(u),m=k(r.connections,M(e=>d(e)!==p(e)),applyPredicate(c));return s.excludeConnections(m),s}},Uu={include:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c})},exclude:({expr:e,model:t,memory:r,stage:s})=>{let c=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:s,memory:r,where:c})}},Wu={include:({model:e,stage:t,where:r})=>{let s=[],c;return c=r?k([...e.elements()],applyElementPredicate(r)):toArray(imap(e.roots(),e=>(e.onlyOneInstance()||s.push(...e.children()),e))),t.addExplicit(c),s.length>1?(t.addConnections(Fu([...c,...s])),t.connectWithExisting(s)):t.addConnections(Fu(c)),t.connectWithExisting(c),t},exclude:({stage:e,memory:t,where:r})=>{let s=k([...t.elements],applyElementPredicate(r));return e.exclude(s),e}};function predicateToPatch(e,{expr:t,where:r,...s}){switch(!0){case K.isElementTagExpr(t):case K.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case Ji.isCustom(t):case K.isCustom(t):case K.isModelRef(t):return;case K.isWhere(t):return Ru[e]({...s,expr:t,where:r});case Ji.isWhere(t):return Uu[e]({...s,expr:t,where:r});case K.isDeploymentRef(t):return Gu[e]({...s,expr:t,where:r});case K.isWildcard(t):return Wu[e]({...s,expr:t,where:r});case Ji.isDirect(t):return Vu[e]({...s,expr:t,where:r});case Ji.isInOut(t):return Hu[e]({...s,expr:t,where:r});case Ji.isOutgoing(t):return Bu[e]({...s,expr:t,where:r});case Ji.isIncoming(t):return zu[e]({...s,expr:t,where:r});default:nonexhaustive(t)}}function excludeModelRelations(e,{stage:t,memory:r},s,c=()=>!0){if(e.size===0)return t;let u=k(r.connections,M(e=>c(e)),M(t=>hasIntersection(t.relations.model,e)),w(t=>t.update({deployment:null,model:intersection(t.relations.model,e)})),applyPredicate(s),M(e=>e.nonEmpty()));return u.length===0?t:t.excludeConnections(u)}function matchConnection(e,t){return applyPredicate(e,t).nonEmpty()}function applyPredicate(...e){if(e.length===1)return t=>applyPredicate(t,e[0]);let[t,r]=e;return r===null?t:ze(t)?t.map(e=>applyPredicate(e,r)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>r(toFilterableRelation(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>r(toFilterableRelation(t)(e))))})}function applyElementPredicate(...e){if(e.length===1){let t=e[0];return t==null?e=>e:e=>e.filter(e=>t(toFilterable(e,e)))}let[t,r]=e;return ze(t)?r==null?t:t.filter(e=>r(toFilterable(e,e))):r?.(toFilterable(t,t))??!0}function matchConnections(e,t){return t?k(e,M(e=>matchConnection(e,t))):e}function toFilterable(e,t){if(isElementModel(e)){let r=isDeploymentElementModel(t)&&isDeployedInstanceModel(t)?t:null;return{kind:e.kind,tags:[...e.tags,...r?.tags??[]],metadata:r?.metadata??e.metadata}}if(isNestedElementOfDeployedInstanceModel(e))return he(e.element,[`tags`,`kind`,`metadata`]);if(isDeployedInstanceModel(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags],metadata:e.metadata};if(isDeploymentNodeModel(e))return he(e,[`tags`,`kind`,`metadata`]);nonexhaustive(e)}function toFilterableRelation(e){return t=>({tags:t.tags,kind:t.kind,metadata:t.metadata,source:toFilterable(t.source,e.source),target:toFilterable(t.target,e.target)})}function resolveAscendingSiblings(e){let t=new Set;for(let r of e.descendingSiblings())t.add(r);return t}const Gu={include:e=>{let{expr:t,where:r}=e,s=e.model.element(t.ref.deployment);if(isDeployedInstanceModel(s))return applyElementPredicate(s,r)&&(e.stage.addExplicit(s),e.stage.connectWithExisting(s)),e.stage;switch(!0){case t.selector===`expanded`:includeDeployedNodeWithExpanded(s,e);break;case t.selector===`children`:includeDeployedNodeChildren(s,e);break;case t.selector===`descendants`:includeDeployedNodeDescendants(s,e);break;default:applyElementPredicate(s,r)&&(e.stage.addExplicit(s),e.stage.connectWithExisting(s))}return e.stage},exclude:({expr:e,stage:t,memory:r,where:s})=>{let c=deploymentExpressionToPredicate(e),u=k([...r.elements],M(c),applyElementPredicate(s));return t.exclude(u),t}};function includeDeployedNodeChildren(e,{stage:t,where:r}){let s=applyElementPredicate([...e.children()],r);s.length!==0&&(t.addImplicit(e),t.addConnections(Fu(s)),t.connectWithExisting(s),t.addExplicit(s))}function includeDeployedNodeWithExpanded(e,{memory:t,stage:r,where:s}){r.addImplicit(e),r.connectWithExisting(e);let c=applyElementPredicate([...e.children()],s),u=!1;for(let e of c)if(Pu(e,t.elements).length>0){u=!0;break}u&&(r.connectWithExisting(c,`in`),r.addConnections(Fu(c)),r.connectWithExisting(c,`out`)),r.addImplicit(c),r.connections.length>0&&r.addExplicit(e)}function includeDeployedNodeDescendants(e,{stage:t,where:r}){let dfs=e=>{let s=[];for(let t of e.children())t.isDeploymentNode()&&s.push(...dfs(t)),applyElementPredicate(t,r)&&s.push(t);return t.connectWithExisting(s,`in`),t.addConnections(Fu(s)),t.addImplicit(s),s},s=dfs(e);if(s.length===0)return;t.connectWithExisting(s,`out`);let c=findConnectedElements(t);k(s,M(e=>c.has(e)),Ve(e=>t.addExplicit(e)))}function findConnectedElements(e){return k(e.mergedConnections(),cleanCrossBoundary,cleanRedundantRelationships,Re((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Ku=class StageFinal$1{static{r(this,`StageFinal`)}memory;includeAncestors;static for(e,t){return new StageFinal$1(e,t)}constructor(e,t){this.memory=e,this.includeAncestors=t}step1CleanConnections(e){if(e.connections.length<2)return e;let t=k(e.connections,cleanCrossBoundary,cleanRedundantRelationships),r=differenceConnections(e.connections,t);if(r.length===0)return e;let s=e.stageExclude({});return s.excludeConnections(r,!0),s.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),r=union(e.final,this.memory.explicits),s=new P.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)s.get(e).add(t.boundary);for(let[e,c]of s)if(!(c.size<2))for(let e of c)t.delete(e)&&r.add(e);let c=new Set(r),isFinalOrHasIncludedDescendant=e=>{for(let t of c)if(e===t||isAncestor(e,t))return!0;return!1};return k(difference(t,c),ifilter(e=>e.isDeploymentNode()),toArray(),sortByFqnHierarchically,Ve(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){r.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&r.add(e)})),e.update({final:r})}step3ProcessBoundaries(e){let t=new Set;for(let r of e.connections)r.boundary&&t.add(r.boundary);let r=treeFromMemoryState(e,`final`),s=e.stageExclude({}),isRemovable=s=>!(t.has(s)||e.explicits.has(s)||r.hasInOut(s)||r.root.has(s)),c=T([...r.root]);c&&!e.explicits.has(c)&&s.exclude(c);for(let t of e.final){let e=T(r.children(t));e&&!r.hasInOut(e)&&isRemovable(t)&&s.exclude(t)}return s.isDirty()?s.commit():e}step4AddAncestor(e){let t=new Set;for(let r of e.final)for(let e of r.ancestors())t.add(e);if(t.size>0){let r=union(e.final,t);return e.update({final:r})}return e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e),r=this.step3ProcessBoundaries(t);return this.includeAncestors===!0?this.step4AddAncestor(r):r}};const qu=createRelationExpressionToPredicates(deploymentExpressionToPredicate);function buildExpandPredicate$1(e,t){let r=[],s=[];for(let e of t)if(isViewRulePredicate$1(e)&&`include`in e)for(let t of e.include)Ji.isCustom(t)&&(t.customRelation.multiple===!0?r.push(t):t.customRelation.multiple===!1&&s.push(t));let c=new Set,u=e.specification.relationships;for(let e of Object.keys(u)){let t=u[e];(t?.style??t)?.multiple&&c.add(e)}if(r.length===0&&s.length===0&&c.size===0)return;let d=r.map(e=>({pred:qu(e.customRelation.expr)})),p=s.map(e=>({pred:qu(e.customRelation.expr)}));return(e,t)=>{let resolveEndpoint=e=>{if(e&&typeof e==`object`){if(`tags`in e&&`kind`in e&&`metadata`in e)return e;if(e.instance&&e.element)return{id:e.id,tags:e.instance.tags,kind:e.element.kind,metadata:e.instance.metadata}}return e??{}},r=resolveEndpoint(t?.source??e.source),s=resolveEndpoint(t?.target??e.target);if(p.length>0){for(let{pred:t}of p)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(c.size>0){let t=e.kind;if(t&&c.has(t))return!0}if(d.length>0){for(let{pred:t}of d)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}r(buildExpandPredicate$1,`buildExpandPredicate`);function processPredicates$1(e,t){let r=Lu.empty(),s=!1;for(let c of t){if(isViewRulePredicate$1(c)){let t=`include`in c?`include`:`exclude`,s=c.include??c.exclude;for(let c of s){let s=t===`include`?r.stageInclude(c):r.stageExclude(c);s=predicateToPatch(t,{expr:c,model:e,stage:s,memory:r,where:null})??s,r=s.commit()}}`includeAncestors`in c&&(s=c.includeAncestors)}return Ku.for(r,s).commit()}r(processPredicates$1,`processPredicates`);function computeDeploymentView(e,{docUri:t,rules:r,...s}){let c=processPredicates$1(e.deployment,r),u=buildNodes$1(e,c),d=buildExpandPredicate$1(e,r),p=toComputedEdges$1(c.connections,d);linkNodesWithEdges(u,p);let m=topologicalSort$1({nodes:u,edges:p}),h=applyDeploymentViewRuleStyles(r,m.nodes),g=ve(r,isViewRuleAutoLayout$1),_=buildElementNotations(h);return calcViewLayoutHash({...s,[Wi]:`computed`,[Gi]:`deployment`,autoLayout:{direction:g?.direction??`TB`,...g?.nodeSep&&{nodeSep:g.nodeSep},...g?.rankSep&&{rankSep:g.rankSep}},edges:m.edges,nodes:w(h,e=>(e.icon===`none`&&delete e.icon,e)),..._.length>0&&{notation:{nodes:_}}})}function flattenGroupRules(e){return t=>isViewRuleGroup$1(t)?t.groupRules.flatMap(flattenGroupRules(e)):isViewRulePredicate$1(t)&&`include`in t?t.include.filter(e):[]}function applyCustomElementProperties(e,t){let r=e.flatMap(flattenGroupRules(q.isCustom));if(r.length===0)return t;let s=[...t];for(let{custom:{expr:e,...t}}of r){let{border:r,opacity:c,multiple:u,iconColor:d,iconSize:p,iconPosition:m,padding:h,size:g,textSize:_,...v}=Ye(t,N),y=exact({border:r,opacity:c,multiple:u,iconColor:d,iconSize:p,iconPosition:m,padding:h,size:g,textSize:_}),b=!se(y),ee=!se(v),te=elementExprToPredicate(e);s.forEach((e,t)=>{isGroupElementKind(e)||!te(e)||(ee&&(e={...e,...v,isCustomized:!0}),b&&(e={...e,isCustomized:!0,style:{...e.style,...y}}),s[t]=e)})}return s}function resolveGlobalRulesInElementView(e,t){return e.reduce((e,r)=>{if(isViewRuleGlobalPredicateRef$1(r)){let s=t.predicates[r.predicateId];return N(s)?e:e.concat(s)}if(isViewRuleGlobalStyle$1(r)){let s=t.styles[r.styleId];return N(s)?e:e.concat(s)}return e.push(r),e},[])}function resolveGlobalRulesInDynamicView(e,t){return e.reduce((e,r)=>{if(isViewRuleGlobalPredicateRef$1(r)){let s=t.dynamicPredicates[r.predicateId];return N(s)?e:e.concat(s)}if(isViewRuleGlobalStyle$1(r)){let s=t.styles[r.styleId];return N(s)?e:e.concat(s)}return e.push(r),e},[])}function elementsFromIncludeProperties(e,t){let r=new Set;for(let s of t)if(isViewRulePredicate$1(s))for(let t of s.include){let s=elementExprToPredicate(t);for(let t of e.elements())s(t)&&r.add(t)}return r}const flattenSteps=e=>{switch(!0){case aa.isStep(e):return[e];case aa.isParallel(e):{let t=[],r=[];for(let s of e.steps){let[e,...c]=flattenSteps(s);e&&t.push(e),r.push(...c)}return[...t,...r]}case aa.isSeries(e):return[...e.steps];case aa.isBreak(e):case aa.isLoop(e):case aa.isOpt(e):return A(e.steps,flattenSteps);case aa.isAlt(e):case aa.isTry(e):{let t=[],r=[],s=e._type===`try`?[e.try,e.catch,e.finally]:[...e.branches];for(let e of s){if(!e)continue;let[s,...c]=A(e.steps,flattenSteps);s&&(t.push(s),r.push(...c))}return[...t,...r]}default:nonexhaustive(e)}};function elementsFromSteps(e,t){let r=[],addActor=(...[e,t])=>{if(!r.includes(e)){let s=r.indexOf(t);if(s>0){r.splice(s,0,e);return}else r.push(e)}r.includes(t)||r.push(t)};for(let s of A(t,flattenSteps)){let t=e.element(s.source),c=e.element(s.target),u=r.indexOf(t),d=r.indexOf(c);u>=0&&d>=0||(s.isBackward?addActor(c,t):addActor(t,c))}return new Set(r)}function findRelations(e,t,r){let s=findConnection$3(e,t,`directed`).flatMap(e=>[...e.relations]).sort(compareRelations);if(!isNonEmptyArray(s))return{};let specificationOf=t=>t?e.$model.specification.relationships[t]:void 0;if(s.length===1){let e=s[0],t=specificationOf(e.kind);return exact({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color??t?.color,line:e.$relationship.line??t?.line,head:e.$relationship.head??t?.head,tail:e.$relationship.tail??t?.tail,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let c=k(s,A(e=>e.tags),pe()),u=j(c,1)?c:void 0,d=w(s,e=>e.id),p=Ue(s).$relationship.navigateTo;p===r&&(p=void 0),p||=k(s,A(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==r?e.$relationship.navigateTo:[]),pe(),T());let m=k(s,Re((e,{title:t,technology:r,kind:s,$relationship:c})=>{let u=specificationOf(s),d=c.color??u?.color,p=c.line??u?.line,m=c.head??u?.head,h=c.tail??u?.tail;return x(t)&&e.title.add(t),x(d)&&e.color.add(d),x(p)&&e.line.add(p),x(m)&&e.head.add(m),x(h)&&e.tail.add(h),x(s)&&e.kind.add(s),x(r)&&e.technology.add(r),x(c.description)&&!e.description.some(le(c.description))&&e.description.push(c.description),e},{kind:new Set,color:new Set,line:new Set,head:new Set,tail:new Set,title:new Set,technology:new Set,description:[]}));return exact({tags:u??void 0,relations:d,navigateTo:p,kind:T([...m.kind]),title:T([...m.title]),color:T([...m.color]),line:T([...m.line]),head:T([...m.head]),tail:T([...m.tail]),technology:T([...m.technology]),description:T(m.description)})}var DynamicViewCompute=class{model;view;steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:r,...s}=this.view,c=resolveGlobalRulesInDynamicView(t,this.model.globals),u=elementsFromIncludeProperties(this.model,c),d=elementsFromSteps(this.model,r),p=k(union(intersection(u,d),d,u),toArray(),sortParentsFirst),m={actors:new Set,flow:[],id:null,_type:null},h=new st.default;h.push(m);let flowStackHead=()=>h.peek()??m,addToFlow=e=>(flowStackHead().flow.push(e),e),addActorToFlow=e=>{flowStackHead().actors.add(e)},newFlow=e=>({actors:new Set,flow:[],...e}),pushFlow=e=>(h.push(e),e),popFlow=()=>{let e=h.pop();return e&&e!==m&&e.flow.length>0&&addToFlow(e),e},processSteps=({steps:e,newflow:t,prefix:r})=>{pushFlow(t),r??=t.id,Re(e,(e,t)=>processStep(t,e,r),1),popFlow()},flowId=(e,t,r)=>StepPath(e,[t,r]),processTryStep=(e,t)=>{let r=1;processSteps({steps:e.try.steps,newflow:newFlow({_type:`try-block`,id:flowId(t,r++,`block`),title:e.try.title})}),e.catch&&processSteps({steps:e.catch.steps,newflow:newFlow({_type:`try-catch`,id:flowId(t,r++,`catch`),title:e.catch.title})}),e.finally&&processSteps({steps:e.finally.steps,newflow:newFlow({_type:`try-finally`,id:flowId(t,r,`finally`),title:e.finally.title})})},processStep=(e,t,r)=>{switch(!0){case aa.isSeries(e):for(let s of e.steps)t=processStep(s,t,r);return t;case aa.isLoop(e):case aa.isOpt(e):case aa.isBreak(e):case aa.isParallel(e):return processSteps({steps:e.steps,newflow:newFlow({_type:e._type,id:flowId(r,t,e._type),title:e.title})}),t+1;case aa.isTry(e):{let{id:s}=pushFlow(newFlow({_type:`try`,id:flowId(r,t,`try`)}));return processTryStep(e,s),popFlow(),t+1}case aa.isAlt(e):{let{id:s}=pushFlow(newFlow({_type:`alt`,id:flowId(r,t,`alt`),title:e.title}));return e.branches.forEach((e,t)=>{processSteps({steps:e.steps,newflow:newFlow({_type:`alt-${e._type}`,id:flowId(s,t+1,e._type),title:e.title})})}),popFlow(),t+1}case aa.isStep(e):{let s=addToFlow(StepPath(r,t)),{source:c,target:u,title:d,isBackward:m,navigateTo:h,notation:g,..._}=e,v=this.model.element(c),y=p.indexOf(v);invariant(y>=0,`Source ${c} not found`);let b=this.model.element(u),ee=p.indexOf(b);invariant(ee>=0,`Target ${u} not found`),addActorToFlow(v),addActorToFlow(b);let{title:te,relations:S,navigateTo:w,...ne}=findRelations(v,b,this.view.id),re=x(h)&&h!==this.view.id?h:w,ie=e.kind?this.model.specification.relationships[e.kind]:void 0;return this.steps.push(exact({...ne,...!e.technology&&!ne.technology&&ie?.technology&&{technology:ie.technology},...!e.color&&!ne.color&&ie?.color&&{color:ie.color},...!e.line&&!ne.line&&ie?.line&&{line:ie.line},...!e.head&&ie?.head&&{head:ie.head},...!e.tail&&ie?.tail&&{tail:ie.tail},..._,id:s,source:v,target:b,navigateTo:re,title:d??te,relations:S??[],isBackward:ee<y})),t+1}default:nonexhaustive(e)}};Re(r,(e,t)=>processStep(t,e),1);let g=buildComputedNodes(this.model.$styles,p.map(elementModelToNodeSource)),_=this.model.$styles.defaults.relationship,v=this.steps.map(({id:e,source:t,target:r,relations:s,title:c,isBackward:u,tags:d,...p})=>{let m=nonNullable(g.get(t.id),`Source node ${t.id} not found`),h=nonNullable(g.get(r.id),`Target node ${r.id} not found`),v={id:e,parent:commonAncestor(t.id,r.id),source:m.id,target:h.id,label:c??null,relations:s,color:_.color,line:_.line,head:_.arrow,tags:d??[],...p};for(u&&(v.dir=`back`);v.parent&&!g.has(v.parent);)v.parent=parentFqn(v.parent);m.outEdges.push(v.id),h.inEdges.push(v.id);for(let e of ancestorsFqn(v.source)){if(e===v.parent)break;g.get(e)?.outEdges.push(v.id)}for(let e of ancestorsFqn(v.target)){if(e===v.parent)break;g.get(e)?.inEdges.push(v.id)}return v}),y=applyCustomElementProperties(c,applyViewRuleStyles(c,p.map(e=>nonNullable(g.get(e.id))))),b=ve(c,isViewRuleAutoLayout$1),ee=buildElementNotations(y);return calcViewLayoutHash({...s,[Gi]:`dynamic`,[Wi]:`computed`,variant:s.variant??`diagram`,flow:toFlowSteps(m),autoLayout:{direction:b?.direction??`LR`,...b?.nodeSep&&{nodeSep:b.nodeSep},...b?.rankSep&&{rankSep:b.rankSep}},nodes:w(y,e=>(e.icon===`none`&&delete e.icon,e)),edges:v,...ee.length>0&&{notation:{nodes:ee}}})}};function computeDynamicView(e,t){return new DynamicViewCompute(e,t).compute()}const Ju=qe(ue(),w(e=>S(e)?e:subflow(e)));function subflow(e){let t={id:e.id,...e.title&&{title:e.title}};if(e._type===`try`){let[r,s,c]=Ju(e.flow);if(N(r)||S(r)||S(s)||S(c))throw Error(`Try block, catch block, and finally block must be subflows`);invariant(r._type===`try-block`,`Try block is required`);let u={_type:e._type,flow:[r],...t};return c?(invariant(c._type===`try-finally`,`3rd party must be a finally block`),invariant(s&&s._type===`try-catch`,`2nd must be a catch block`),u.flow=[r,s,c],u):s?(invariant(s._type===`try-catch`||s._type===`try-finally`,`2nd element must be a catch or finally block, it is ${s._type}`),u.flow=[r,s],u):u}return{flow:Ju(e.flow),_type:e._type,...t}}function toFlowSteps(e){return e.flow.map(e=>{if(S(e))return e;let t=subflow(e);if(t._type===`alt-else`||t._type===`alt-if`||t._type===`alt-when`||t._type===`try-block`||t._type===`try-catch`||t._type===`try-finally`)throw Error(`Unsupported root-level subflow type: ${t._type}`);return t})}function applyCustomRelationProperties(e,t,r){let s=e.flatMap(flattenGroupRules(Xi.isCustom)),c=Array.from(r);if(s.length===0||c.length===0)return c;for(let{customRelation:{expr:e,title:r,description:u,notes:d,multiple:p,...m}}of s){let s=u?{description:MarkdownOrString$1(u)}:{},p=d?{notes:MarkdownOrString$1(d)}:{},h=Ye(m,N),g=Du(e);c.forEach((e,u)=>{let d,m;for(let r of t)if(r.id===e.source&&(d=r),r.id===e.target&&(m=r),d&&m)break;!d||!m||g({source:d,target:m,...he(e,[`kind`,`tags`])})&&(c[u]={...e,...h,...s,...p,label:r??e.label,isCustomized:!0})})}return c}function findRedundantConnections(e){return k([...e],mergeConnections,Re((e,t,r,s)=>{let c=findDescendantConnections(s,t),u=union(...c.map(D(`relations`))),d=intersection(t.relations,u);if(c.length>0&&(d=union(d,t.directRelations)),findDeepestNestedConnection(s,t.reversed())&&(d=union(d,t.directRelations)),d.size<t.relations.size){let e=s.some(isAnyInOut(t.source)),r=s.some(isAnyInOut(t.target));e&&(d=union(d,toSet(ifilter(t.relations,isOutgoing(t.source))))),r&&(d=union(d,toSet(ifilter(t.relations,isIncoming(t.target)))))}return d.size>0&&e.push(t.update(d)),e},[]))}var Yu=class StageFinal{memory;static for(e){return new StageFinal(e)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=findRedundantConnections(e.connections);if(t.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(t,!0),r.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),r=union(e.final,this.memory.explicits),s=new Set(r),isFinalOrHasIncludedDescendant=e=>{for(let t of s)if(e===t||isAncestor(e,t))return!0;return!1};return k(difference(t,s),toArray(),sortByFqnHierarchically,Ve(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){r.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&r.add(e)})),e.update({final:r})}step3ProcessBoundaries(e){let t=new Set;for(let r of e.connections)r.boundary&&r.boundary!==r.source&&r.boundary!==r.target&&t.add(r.boundary);let r=treeFromMemoryState(e,`final`),s=e.stageExclude({}),isRemovable=s=>!(t.has(s)||e.explicits.has(s)||r.hasInOut(s)||r.root.has(s)),c=T([...r.root]);c&&!e.explicits.has(c)&&s.exclude(c);for(let t of e.final){let e=T(r.children(t));e&&!r.hasInOut(e)&&isRemovable(t)&&s.exclude(t)}return s.isDirty()?s.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:Xu,findConnectionsBetween:Zu,findConnectionsWithin:Qu}=Ga;function resolveElements(e,t){switch(!0){case q.isElementKindExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case q.isElementTagExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let r=e.element(G.flatten(t.ref));return[r,...r.children()]}case t.selector===`children`:case t.selector===`descendants`:{let r=e.element(G.flatten(t.ref)),s=t.selector===`children`?toArray(r.children()):toArray(r.descendants());return s&&s.length>0?s:[r]}case q.isModelRef(t):return[e.element(G.flatten(t.ref))];default:nonexhaustive(t)}}function includeDescendantsFromMemory(e,t){if(t.isEmpty()||e.length===0)return e;let r=ge(e.map(e=>isDescendantOf(e))),s=toArray(ifilter(t.elements,t=>!e.includes(t)&&r(t)));return[...e,...s]}function resolveAndIncludeFromMemory(e,{memory:t,model:r}){let s=resolveElements(r,e);return q.isModelRef(e)?e.selector===`descendants`?s:includeDescendantsFromMemory(s,t):s}const $u={include:({expr:e,model:t,stage:r,where:s})=>{let c=t.element(G.flatten(e.ref));s(c)&&(r.addExplicit(c),r.connectWithExisting(c));let u=[...c.children()].filter(s),d=[];for(let e of u)r.addImplicit(e),r.connectWithExisting(e)&&d.push(e);return r.addConnections(Qu(d)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},ed={include:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));if(c.length!==0)return r.addExplicit(c),r.connectWithExisting(c),r.addConnections(Qu(c)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},td={include:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));if(c.length!==0)return r.addExplicit(c),r.connectWithExisting(c),r.addConnections(Qu(c)),r},exclude:({expr:e,model:t,stage:r,filterWhere:s})=>{let c=s(resolveElements(t,e));return r.exclude(c),r}},NoWhere=()=>!0,NoFilter=e=>e,hashEdgeId=(e,t,r)=>stringHash$1(`model:${e}:${t}:${r}`);function toComputedEdges(e,t){return e.flatMap(e=>{let r=[...e.relations];invariant(j(r,1),`Edge must have at least one relation`);let s=e.source.$model.$styles.defaults,c=e.source.id,u=e.target.id,d=M(r,e=>e.source.id===c&&e.target.id===u);if(t&&r.length>1){let[d,p]=k(r,Xe(r=>t(r,e)));if(d.length>0){let t=d.map(t=>{let{title:r,color:d=s.relationship.color,line:p=s.relationship.line,head:m=s.relationship.arrow,...h}=mergePropsFromRelationships([t.$relationship],t.$relationship);return{id:hashEdgeId(c,u,t.id),parent:e.boundary?.id??null,source:c,target:u,label:r??null,relations:[t.id],color:d,line:p,head:m,...h}});if(p.length>0){let{title:r,color:d=s.relationship.color,line:m=s.relationship.line,head:h=s.relationship.arrow,...g}=mergePropsFromRelationships(p.map(e=>e.$relationship),T(M(p,e=>e.source.id===c&&e.target.id===u))?.$relationship);t.push({id:e.id,parent:e.boundary?.id??null,source:c,target:u,label:r??null,relations:p.map(e=>e.id),color:d,line:m,head:h,...g})}return t}}let{title:p,color:m=s.relationship.color,line:h=s.relationship.line,head:g=s.relationship.arrow,..._}=mergePropsFromRelationships(r.map(e=>e.$relationship),T(d)?.$relationship);return[exact({id:e.id,parent:e.boundary?.id??null,source:c,target:u,label:p??null,relations:r.map(e=>e.id),color:m,line:h,head:g,..._})]})}function buildNodes(e,t){return buildComputedNodes(e.$styles,[...t.final].map(elementModelToNodeSource),t.groups)}const nd=q.isWildcard,isAncestorOrDescendantOf=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),rd={include:({expr:{source:e,target:t,isBidirectional:r=!1},memory:s,model:c,stage:u,where:d,filterWhere:p})=>{let m=nd(e),h=nd(t),g=[];switch(!0){case m&&h&&s.isEmpty()&&d!==NoWhere:{let e=k(c.relationships(),ifilter(d),toArray(),w(e=>new Ua(e.source,e.target,new Set([e]))));return u.addConnections(e),u}case m&&h&&!s.isEmpty()&&d!==NoWhere:g.push(...Qu(s.elements));break;case m&&h:g.push(...Qu(c.roots()));break;case!m&&h&&d!==NoWhere:{let t=k(resolveElements(c,e),A(e=>k(e,Pe(Te(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(d),iunique(),toArray(),Xe(t=>t.source===e),([t,r])=>fe(k(t,M(t=>!isAncestorOrDescendantOf(e,t.target)),w(t=>new Ua(e,t.target,new Set([t])))),k(r,M(t=>!isAncestorOrDescendantOf(e,t.source)),w(t=>new Ua(t.source,e,new Set([t]))))))));return u.addConnections(t),u}case!m&&h:{let[t,u]=resolveWildcard(e,{memory:s,model:c}),d=r?`both`:`directed`;for(let e of t)g.push(...Zu(e,u,d));break}case m&&!h&&d!==NoWhere:{let e=k(resolveElements(c,t),A(e=>k(e,Pe(Te(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(d),toArray(),Xe(t=>t.target===e),([t,r])=>fe(k(r,M(t=>!isAncestorOrDescendantOf(e,t.target)),w(t=>new Ua(e,t.target,new Set([t])))),k(t,M(t=>!isAncestorOrDescendantOf(e,t.source)),w(t=>new Ua(t.source,e,new Set([t]))))))));return u.addConnections(e),u}case m&&!h:{let[e,u]=resolveWildcard(t,{memory:s,model:c}),d=r?`both`:`directed`;for(let t of u)g.push(...Zu(t,e,d));break}default:{invariant(!nd(e),`Inference failed - source must be not a wildcard`),invariant(!nd(t),`Inference failed - target must be not a wildcard`);let u=resolveAndIncludeFromMemory(e,{memory:s,model:c}),d=resolveAndIncludeFromMemory(t,{memory:s,model:c}),p=r?`both`:`directed`;for(let e of u)g.push(...Zu(e,d,p))}}return u.addConnections(p(g)),u},exclude:({expr:{source:e,target:t,isBidirectional:r},model:s,memory:c,stage:u,where:d})=>{let p=nd(e),m=nd(t),h;switch(!0){case p&&m:h=k(c.connections,A(qe(D(`relations`),ifilter(d),toArray())),toSet());break;case!p&&m:h=k(resolveElements(s,e),A(e=>k(e,Pe(Te(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(d),toArray())),toSet());break;case p&&!m:h=k(resolveElements(s,t),A(e=>k(e,Pe(Te(r===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(d),toArray())),toSet());break;default:{invariant(!nd(e),`Inference failed - source must be not a wildcard`),invariant(!nd(t),`Inference failed - target must be not a wildcard`);let c=resolveElements(s,e),u=resolveElements(s,t),p=new Set;for(let e of c)for(let t of u)isSameHierarchy(e,t)||(p=union(p,intersection(e.allOutgoing,t.allIncoming),r?intersection(t.allOutgoing,e.allIncoming):new Set));h=toSet(ifilter(p,d))}}return u.excludeRelations(h),u}};function resolveWildcard(e,{memory:t,model:r}){let s=resolveElements(r,e);if(!j(s,1))return[[],[]];if(q.isModelRef(e)){let c=toArray(r.element(G.flatten(e.ref)).ascendingSiblings());return[includeDescendantsFromMemory(s,t),includeDescendantsFromMemory(c,t)]}return[s,k(s,w(e=>e.ascendingSiblings()),iflat(),iunique(),toArray(),e=>includeDescendantsFromMemory(e,t))]}const id={include:({expr:e,scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=e.incoming,p=[];if(q.isWildcard(d)){if(!t)return;for(let e of t.ascendingSiblings())p.push(...Xu(e,t,`directed`))}else{let e=resolveAndIncludeFromMemory(d,{memory:s,model:r}),t=[...s.elements];t.length===0&&t.push(...pe(e.flatMap(e=>[...e.ascendingSiblings()])));let c=incomingConnectionPredicate(r,d);for(let r of t)p.push(...Zu(r,e,`directed`).filter(c))}return c.addConnections(u(p)),c},exclude:({expr:{incoming:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allIncoming)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allIncoming]))}return s.excludeRelations(new Set(u.filter(c))),s}};function incomingConnectionPredicate(e,t){switch(!0){case q.isElementKindExpr(t):case q.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.target)}case q.isModelRef(t)&&t.selector===`children`:{let r=G.flatten(t.ref);return ge([...e.children(r)].map(e=>Ba.isIncoming(e.id)))}case q.isModelRef(t)&&t.selector===`descendants`:{let r=G.flatten(t.ref);return ge([Ba.isInside(r),...[...e.children(r)].map(e=>Ba.isIncoming(e.id))])}case q.isModelRef(t)&&t.selector===`expanded`:{let e=G.flatten(t.ref);return ge([Ba.isIncoming(e),Ba.isInside(e)])}case q.isModelRef(t):{let e=G.flatten(t.ref);return Ba.isIncoming(e)}default:nonexhaustive(t)}}const ad={include:({expr:{inout:e},scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=[];if(q.isWildcard(e)){if(!t)return;d.push(...Zu(t,t.ascendingSiblings()))}else{let t=resolveAndIncludeFromMemory(e,{memory:s,model:r}),c=[...s.elements];c.length===0&&(c=pe(t.flatMap(e=>toArray(e.ascendingSiblings()))));for(let e of t)d.push(...Zu(e,c))}return c.addConnections(u(d)),c},exclude:({expr:{inout:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allOutgoing),u.push(...r.allIncoming)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return s.excludeRelations(toSet(u.filter(c))),s}},od={include:({expr:e,scope:t,model:r,memory:s,stage:c,filterWhere:u})=>{let d=e.outgoing,p=[];if(q.isWildcard(d)){if(!t)return;p.push(...Zu(t,t.ascendingSiblings(),`directed`))}else{let e=resolveAndIncludeFromMemory(d,{memory:s,model:r}),t=[...s.elements];t.length===0&&t.push(...pe(e.flatMap(e=>[...e.ascendingSiblings()])));let c=outgoingConnectionPredicate(r,d);for(let r of e)p.push(...Zu(r,t,`directed`).filter(c))}return c.addConnections(u(p)),c},exclude:({expr:{outgoing:e},model:t,scope:r,stage:s,where:c})=>{let u=[];if(q.isWildcard(e)){if(!r)return;u.push(...r.allOutgoing)}else{let r=resolveElements(t,e);u.push(...r.flatMap(e=>[...e.allOutgoing]))}return s.excludeRelations(toSet(u.filter(c))),s}};function outgoingConnectionPredicate(e,t){switch(!0){case q.isElementKindExpr(t):case q.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.source)}case q.isModelRef(t)&&t.selector===`children`:{let r=G.flatten(t.ref);return ge([...e.children(r)].map(e=>Ba.isOutgoing(e.id)))}case q.isModelRef(t)&&t.selector===`descendants`:{let r=G.flatten(t.ref);return ge([Ba.isInside(r),...[...e.children(r)].map(e=>Ba.isOutgoing(e.id))])}case q.isModelRef(t)&&t.selector===`expanded`:{let e=G.flatten(t.ref);return ge([Ba.isOutgoing(e),Ba.isInside(e)])}case q.isModelRef(t):{let e=G.flatten(t.ref);return Ba.isOutgoing(e)}default:nonexhaustive(t)}}const sd={include:({scope:e,model:t,stage:r,memory:s,where:c})=>{if(!e){let e=c===NoWhere?[...t.roots()]:toArray(ifilter(t.elements(),c));if(e.length===0)return;let[s,u]=Xe(e,e=>!e.imported);return r.addExplicit(s),r.addImplicit(u),r.addConnections(Qu(e)),r.connectWithExisting(e),r}let u=toArray(ifilter(e.children(),c)),d=u.length>0;if(!d){let t=Zu(e,e.siblings()),s=e.parent;t.length===0&&s&&r.addExplicit(s),u.push(e)}r.addExplicit(e);let p=toSet([...s.elements,...e.descendingSiblings()]);for(let e of p)r.addConnections(Zu(e,u,`directed`));d&&(r.addConnections(Qu(u)),r.addExplicit(u));for(let e of u)r.addConnections(Zu(e,p,`directed`));return r},exclude:({scope:e,memory:t,stage:r,where:s})=>s===NoWhere?e?(r.exclude([e,...e.descendants()]),r):ju.empty(t.scope).stageExclude(r.expression):(r.exclude(M([...t.elements],s)),r)};function processElementPredicate(e,t,r){switch(!0){case q.isCustom(e):return t===`include`?processElementPredicate(e.custom.expr,t,r):r.stage;case q.isWhere(e):{let s=whereOperatorAsPredicate(e.where.condition),filterWhere=e=>M(e,s);return processElementPredicate(e.where.expr,t,{...r,where:s,filterWhere})}case q.isModelRef(e)&&e.selector===`expanded`:return $u[t]({...r,expr:e})??r.stage;case q.isWildcard(e):return sd[t]({...r,expr:e})??r.stage;case q.isElementKindExpr(e):case q.isElementTagExpr(e):return ed[t]({...r,expr:e})??r.stage;case q.isModelRef(e):return td[t]({...r,expr:e})??r.stage;default:nonexhaustive(e)}}function processRelationtPredicate(e,t,r){switch(!0){case Xi.isCustom(e):return t===`include`?processRelationtPredicate(e.customRelation.expr,t,r):r.stage;case Xi.isWhere(e):{let s=whereOperatorAsPredicate(e.where.condition),filterRelations=e=>new Set(M([...e],s)),filterWhere=e=>k(e,w(e=>new Ua(e.source,e.target,filterRelations(e.relations))),M(e=>e.nonEmpty()));return processRelationtPredicate(e.where.expr,t,{...r,where:s,filterWhere})}case Xi.isInOut(e):return ad[t]({...r,expr:e})??r.stage;case Xi.isDirect(e):return rd[t]({...r,expr:e})??r.stage;case Xi.isOutgoing(e):return od[t]({...r,expr:e})??r.stage;case Xi.isIncoming(e):return id[t]({...r,expr:e})??r.stage;default:nonexhaustive(e)}}function process_predicates(e,t,r){let s={model:e,scope:t.scope,where:NoWhere,filterWhere:NoFilter};for(let c of r){if(isViewRuleGroup$1(c)){t=process_predicates(e,Mu.enter(t,c),c.groupRules),invariant(t instanceof Mu,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(isViewRulePredicate$1(c)){let e=`include`in c?`include`:`exclude`,r=c.include??c.exclude;for(let c of r){let r=e===`include`?t.stageInclude(c):t.stageExclude(c);switch(!0){case Zi.isFqnExpr(c):r=processElementPredicate(c,e,{...s,stage:r,memory:t})??r;break;case Zi.isRelationExpr(c):r=processRelationtPredicate(c,e,{...s,stage:r,memory:t})??r;break;default:nonexhaustive(c)}t=r.commit()}}}return t}function processPredicates(e,t,r){return t=process_predicates(e,t,r),Yu.for(t).commit()}function buildExpandPredicate(e,t){let r=t.flatMap(flattenGroupRules(Xi.isCustom)).filter(e=>e.customRelation.multiple===!0),s=t.flatMap(flattenGroupRules(Xi.isCustom)).filter(e=>e.customRelation.multiple===!1),c=new Set,u=e.specification.relationships;for(let e of Object.keys(u)){let t=u[e];(t?.style??t)?.multiple&&c.add(e)}if(r.length===0&&s.length===0&&c.size===0)return;let d=r.map(e=>({pred:Du(e.customRelation.expr)})),p=s.map(e=>({pred:Du(e.customRelation.expr)}));return(e,t)=>{let r=t?.source??e.source,s=t?.target??e.target;if(p.length>0){for(let{pred:t}of p)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(c.size>0){let t=e.kind;if(t&&c.has(t))return!0}if(d.length>0){for(let{pred:t}of d)if(t({source:r,target:s,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}function computeElementView(e,{docUri:t,rules:r,...s}){let c=resolveGlobalRulesInElementView(r,e.globals),u=s.viewOf?e.asComputed.element(s.viewOf):null,d=processPredicates(e,ju.empty(u),c);d.isEmpty()&&u&&(d=d.update({final:new Set([u])})),d=assignElementsToGroups(d);let p=buildNodes(e,d),m=buildExpandPredicate(e,c),h=toComputedEdges(d.connections,m);linkNodesWithEdges(p,h);let g=topologicalSort$1({nodes:p,edges:h}),_=applyCustomElementProperties(c,applyViewRuleStyles(c,g.nodes)),v=ve(c,isViewRuleAutoLayout$1),y=buildElementNotations(_),b=collectRankConstraints(c,_);return calcViewLayoutHash({...s,_stage:`computed`,autoLayout:{direction:v?.direction??`TB`,...v?.nodeSep&&{nodeSep:v.nodeSep},...v?.rankSep&&{rankSep:v.rankSep}},edges:applyCustomRelationProperties(c,_,g.edges),nodes:w(_,e=>(e.icon===`none`&&delete e.icon,e)),...y.length>0&&{notation:{nodes:y}},...b.length>0&&{ranks:b}})}function collectRankConstraints(e,t){let r=[];for(let s of e){if(!isViewRuleRank$1(s)||s.targets.length===0)continue;let e=k(t,M(ge(s.targets.map(elementExprToPredicate))),w(e=>e.id));j(e,1)&&r.push({type:s.rank,nodes:e})}return r}function assignElementsToGroups(e){if(e.groups.length===0)return e;let t=new P.default(()=>new Set),r=new Map,isAncestorAssigned=e=>{for(let s of e.ancestors()){let c=r.get(s);if(c)return r.set(e,c),t.get(c).add(e),!0}return!1},isDescendantAssigned=e=>{for(let s of e.descendants(`asc`)){let c=r.get(s);if(c)return r.set(e,c),t.get(c).add(e),!0}return!1};if(k(sortParentsFirst([...e.explicitFirstSeenIn.keys()]),Ve(s=>{if(!isAncestorAssigned(s)){let c=nonNullable(e.explicitFirstSeenIn.get(s));r.set(s,c),t.get(c).add(s)}})),k(sortParentsFirst([...e.lastSeenIn.keys()]),M(e=>!r.has(e)),Ve(s=>{if(isAncestorAssigned(s)||isDescendantAssigned(s))return;let c=nonNullable(e.lastSeenIn.get(s));r.set(s,c),t.get(c).add(s)})),t.size===0)return e;let s=e.groups.map(e=>{let r=t.get(e.id);return r?e.update(r):e});return e.update({groups:s})}function unsafeComputeView(e,t){switch(!0){case isElementView$1(e):return computeElementView(t,e);case isDeploymentView$1(e):return computeDeploymentView(t,e);case isDynamicView$1(e):return computeDynamicView(t,e);default:nonexhaustive(e)}}function computeView(e,t){try{return{isSuccess:!0,view:unsafeComputeView(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function computeParsedModelData(e){let t=za.create(e),{views:r,_stage:s,...c}=e,u=h(r,e=>unsafeComputeView(e,t));return{[Wi]:`computed`,...c,views:u}}function computeLikeC4Model(e){return za.create(computeParsedModelData(e))}function resolveRulesExtendedViews(e){let t=new Lt({type:`directed`}),r=[];for(let s of Be(e))t.addNode(s.id,{view:s}),isExtendsElementView(s)&&r.push(s);if(r.length===0)return e;for(let e of r){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,Oa.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,Da.topologicalSort)(t).reverse().reduce((e,r)=>{let s=t.getNodeAttribute(r,`view`);if(!isExtendsElementView(s))return e[s.id]=s,e;let c=e[s.extends];if(!c||!isElementView$1(c))return e;let u=pe([...c.tags??[],...s.tags??[]]),d=[...c.links??[],...s.links??[]];return e[s.id]={...c,...s,title:s.title??c.title??null,description:s.description??c.description??null,tags:u,links:isNonEmptyArray(d)?d:null,rules:[...c.rules,...s.rules]},e},{})}const keysCount=e=>u(e).length,cd=r(e=>stringHash$1(e),`nodeId`);function computeProjectsView(e){let t=buildNodesForEachModel(e),key=(e,t)=>`${e}->${t}`,r=new P.default(e=>{let[t,r]=e.split(`->`);return{from:t,to:r,relationships:new Set}}),relationshipsFromTo=(e,t)=>r.get(key(e,t)).relationships,processImportedElement=(e,t)=>{let r=t.projectId;invariant(r!==e.projectId,`Imported element must have a different project id`);let s=relationshipsFromTo(e.projectId,r);for(let r of t.incoming(`direct`))r.source.projectId===e.projectId&&s.add(r);let c=relationshipsFromTo(r,e.projectId);for(let r of t.outgoing(`direct`))r.target.projectId===e.projectId&&c.add(r)};for(let t of e)if(!E(t.$data.imports))for(let[e,r]of be(t.$data.imports))for(let s of r){let r=GlobalFqn(e,s.id);processImportedElement(t,nonNullable(t.findElement(r),`Element ${s.id} from project ${e} not found in model ${t.projectId}`))}let s=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:r,relationships:s}])=>{let c=[...s];invariant(j(c,1),`Relationships set must have at least one relationship`);let u={id:stringHash$1(e),source:cd(t),target:cd(r),projectId:t,relations:w(c,D(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:pe(A(c,D(`tags`)))},d=T(c);return d&&(u.label=d.title,u.description=preferSummary(d.$relationship)??null,u.technology=d.technology,u.color=d.color,u.line=d.line,d.kind&&(u.kind=d.kind),d.$relationship.navigateTo&&(u.navigateTo=d.$relationship.navigateTo)),u});linkNodesWithEdges(t,s);let c=topologicalSort$1({nodes:t,edges:s});return{id:`projects-view`,[Gi]:`projects`,[Wi]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...c}}function buildNodesForEachModel(e){let t=new Map;for(let r of e){let e=ProjectId(r.projectId),s={id:cd(e),kind:`@project`,parent:null,projectId:e,title:r.project.title??r.project.id,description:{txt:[`Elements: ${keysCount(r.$data.elements)}`,`Relationships: ${keysCount(r.$data.relations)}`,`Views: ${keysCount(r.$data.views)}`].join(`
78
+ `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(s.id,s)}return t}const asTypedExpr=e=>e;function $expr(e){if(!S(e))return e;if(e===`*`)return asTypedExpr({wildcard:!0});if(e.startsWith(`->`))return e.endsWith(`->`)?asTypedExpr({inout:$expr(e.replace(/->/g,``).trim())}):asTypedExpr({incoming:$expr(e.replace(`-> `,``))});if(e.endsWith(` ->`))return asTypedExpr({outgoing:$expr(e.replace(` ->`,``))});if(e.includes(` <-> `)){let[t,r]=e.split(` <-> `);return asTypedExpr({source:$expr(t),target:$expr(r),isBidirectional:!0})}if(e.includes(` -> `)){let[t,r]=e.split(` -> `);return asTypedExpr({source:$expr(t),target:$expr(r)})}return e.endsWith(`._`)?asTypedExpr({ref:{model:e.replace(`._`,``)},selector:`expanded`}):e.endsWith(`.**`)?asTypedExpr({ref:{model:e.replace(`.**`,``)},selector:`descendants`}):e.endsWith(`.*`)?asTypedExpr({ref:{model:e.replace(`.*`,``)},selector:`children`}):asTypedExpr({ref:{model:e}})}function computeAdhocView(e,t){return{...computeElementView(e,{id:ViewId(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}const ld=Y.getChild(`LanguageServices`),ud=r(e=>e.severity===un.Error,`isErrorDiagnostic`);var DefaultLikeC4LanguageServices=class{services;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}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=k(this.services.shared.workspace.LangiumDocuments.groupedByProject(),be(),w(([t,r])=>{let s=t,{folderUri:c,config:u}=e.getProject(s);return{id:s,folder:c,title:u.title??u.name,documents:w(r,D(`uri`)),config:u}}));if(j(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(j(t,1))return t;let{id:r,folderUri:s,config:c}=e.default;return[{id:r,folder:s,title:c.title??c.name,documents:[],config:c}]}project(e){let{id:t,folderUri:r,config:s}=this.projectsManager.ensureProject(e),c=w(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),D(`uri`));return{id:t,folder:r,title:s.title??s.name,documents:c,config:s}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),s=await this.builder.computeModel(r,t);if(!s)throw Error(`Failed to compute model, empty project?`);let c=await this.views.layoutAllViews(r,t);return za.create({...s.$data,_stage:`layouted`,views:k(c,w(D(`diagram`)),b(D(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let s of t){let t=await this.builder.computeModel(s,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===za.EMPTY){ld.debug(`Project ${s} is empty, skipping`);continue}r.push(t)}if(!j(r,1))throw Error(`No models found`);let s=computeProjectsView(r);return await this.views.layouter.layoutProjectsView(s)}getErrors(){return k(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),A(e=>k(e.diagnostics??[],M(ud),w(({message:t,range:r})=>({message:t,line:r.start.line,range:r,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:nonexhaustive(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,s=buildFormattingOptions(e),c=this.collectDocumentsToFormat(t,e);c.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let u=new Map;for(let e of c){let t=e.uri.toString(),c=await r.formatDocument(e,{options:s,textDocument:{uri:t}}),d=c.length===0?e.textDocument.getText():qt.applyEdits(e.textDocument,c);u.set(t,d)}return u}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],s=t?.documentUris??[],c=new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))c.set(r.uri.toString(),r);else if(s.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))c.set(r.uri.toString(),r);for(let t of s){if(c.has(t))continue;let r;try{r=e.getDocument(fn.parse(t))}catch{ld.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(r)){ld.warn(`format: skipping unknown document ${t}`);continue}c.set(t,r)}return[...c.values()]}async dispose(){try{ld.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){ld.error(loggable(e))}finally{ld.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(isLikeC4LangiumDocument(e))return e.state<rn.Linked&&(Y.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(rn.Linked,e.uri,r),Y.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=lu.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let s=projectIdFrom(e);return{range:{start:r.start,end:{line:r.start.line,character:r.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,s],title:`open preview`}}})}};function isCompletionForPojectName(e,t){return Tn(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const dd=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
79
79
  title 'Untitled'
80
80
 
81
81
  include \${0:*}
82
- }`;var LikeC4CompletionProvider=class extends sn{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,r){switch(!0){case Gn(t.feature):return this.completionForKeyword(e,t.feature,r);case Rn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptProperty=s=>{r(e,{label:t.value,detail:`Insert ${t.value} property`,kind:Pn.Property,insertTextFormat:xn.Snippet,insertText:`${t.value} ${s}`})},acceptSnippet=({insertText:s,...c})=>{r(e,{label:t.value,detail:`Insert ${t.value}`,kind:Pn.Snippet,insertTextFormat:xn.Snippet,...c,insertText:`${t.value} ${s}`})},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&fn(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:Pn.Class,insertText:`view ${Ju}`});break;case t.value===`dynamic`&&fn(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:Pn.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
83
- `)});break;case t.value===`view`&&fn(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:Pn.Class,insertText:Ju});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(Mi);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(Ni);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(ki);break;case t.value===`border`:acceptPropertyAndSuggest(ji);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
82
+ }`;var LikeC4CompletionProvider=class extends mn{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,r){switch(!0){case Sn(t.feature):return this.completionForKeyword(e,t.feature,r);case Xn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptProperty=s=>{r(e,{label:t.value,detail:`Insert ${t.value} property`,kind:Ut.Property,insertTextFormat:Yt.Snippet,insertText:`${t.value} ${s}`})},acceptSnippet=({insertText:s,...c})=>{r(e,{label:t.value,detail:`Insert ${t.value}`,kind:Ut.Snippet,insertTextFormat:Yt.Snippet,...c,insertText:`${t.value} ${s}`})},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&_n(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:Ut.Class,insertText:`view ${dd}`});break;case t.value===`dynamic`&&_n(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:Ut.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
83
+ `)});break;case t.value===`view`&&_n(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:Ut.Class,insertText:dd});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(Ri);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(zi);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(Fi);break;case t.value===`border`:acceptPropertyAndSuggest(Li);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
84
84
  $0
85
- }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:Pn.Module,insertText:`{
85
+ }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:Ut.Module,insertText:`{
86
86
  $0
87
- }`});break;case t.value===`group`:acceptSnippet({kind:Pn.Module,insertText:`'\${1:Title}' {
87
+ }`});break;case t.value===`group`:acceptSnippet({kind:Ut.Module,insertText:`'\${1:Title}' {
88
88
  $0
89
- }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:Pn.Module,insertText:`{
89
+ }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:Ut.Module,insertText:`{
90
90
  $0
91
- }`});break;case t.value===`style`&&e.node&&fn(e.node,isGlobalStyle):acceptSnippet({kind:Pn.Module,insertText:`\${1:name} \${2:*} {
91
+ }`});break;case t.value===`style`&&e.node&&_n(e.node,isGlobalStyle):acceptSnippet({kind:Ut.Module,insertText:`\${1:name} \${2:*} {
92
92
  $0
93
- }`});break;case t.value===`style`&&e.node&&fn(e.node,ye([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:Pn.Module,insertText:`\${1:*} {
93
+ }`});break;case t.value===`style`&&e.node&&_n(e.node,ge([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:Ut.Module,insertText:`\${1:*} {
94
94
  $0
95
- }`});break;case t.value===`style`:acceptSnippet({kind:Pn.Module,insertText:`{
95
+ }`});break;case t.value===`style`:acceptSnippet({kind:Ut.Module,insertText:`{
96
96
  $0
97
- }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:Pn.Class,insertText:`$1 {
97
+ }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:Ut.Class,insertText:`$1 {
98
98
  $0
99
- }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):r(e,{label:t.value,kind:Pn.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:xn.PlainText,insertText:`${t.value} `});break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,s=e.document.textDocument,c={start:s.positionAt(e.tokenOffset),end:s.positionAt(e.tokenEndOffset)},u=s.getText(c),d=j(u)?`'`:u.substring(0,1);for(let s of r.all){let r=d+s+d;t(e,{label:s,kind:Pn.Folder,insertText:r,filterText:r,textEdit:mn.replace(c,r),detail:`Project`,sortText:`0_`+s})}}},LikeC4DocumentHighlightProvider=class extends Fn{createDocumentHighlight(e){return uu.DocumentHighlight.create(e.segment.range,uu.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:nn(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let r=qt(t.$cstNode,`value`)?.range,s=r&&this.resolveLink(e,t.value);if(s&&Ir(s))return{range:r,target:s}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Ir(t)||Pr(t))return t;if(Mr(t))return kr(e.uri.toString(),`../`,t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return kr(r.toString(),t)}relativeLink(e,t){if(Pr(t))return Nr(t);if(Mr(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),s=new URL(e.uri.toString());return Nr(Ar(new URL(t,s).toString(),r))}return null}};$n();const Yu=Y.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;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,r){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<Kt.Linked&&(Yu.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Kt.Linked,e.uri,r),Yu.debug(`document is Linked`));let{parseResult:{value:{specifications:s,models:c,deployments:u,views:d,likec4lib:p}}}=e;return[...p.map(e=>()=>this.getLikec4LibSymbol(e)),...s.map(e=>()=>this.getSpecSymbol(e)),...c.map(e=>()=>this.getModelSymbol(e)),...u.map(e=>()=>this.getDeploymentModelSymbol(e)),...d.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(T);return r.length===0?[]:[{kind:En.Namespace,name:`icons`,range:t.range,selectionRange:ln(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=qt(t,`name`);if(!r)return[];let s=N([...e.elements,...e.tags,...e.relationships],D(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return logWarnError(e),null}nonexhaustive(e)}),F(T));return s.length===0?[]:[{kind:En.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:s}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=qt(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=qt(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){logWarnError(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,s=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:s.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=qt(t,`name`);if(!r||!t)return[];let s=e.name,c=e.kind.$refText;return[{kind:this.symbolKind(e),name:s,range:t.range,selectionRange:r.range,detail:c,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=qt(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||j(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||j(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||j(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 r=e.name?qt(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){logWarnError(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let s=this.nameProvider.getNameStrict(e),c=e.kind.$refText;return[{kind:this.symbolKind(e),name:s,range:t.range,selectionRange:r.range,detail:c,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let s=un(e),c=this.parser.forDocument(s).parseDeployedInstance(e),u=this.nameProvider.getNameStrict(e),d=`instance of `+c.element.model;return[{kind:this.symbolKind(e),name:u,range:t.range,selectionRange:r.range,detail:d,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Xu=`
99
+ }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):r(e,{label:t.value,kind:Ut.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Yt.PlainText,insertText:`${t.value} `});break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,s=e.document.textDocument,c={start:s.positionAt(e.tokenOffset),end:s.positionAt(e.tokenEndOffset)},u=s.getText(c),d=E(u)?`'`:u.substring(0,1);for(let s of r.all){let r=d+s+d;t(e,{label:s,kind:Ut.Folder,insertText:r,filterText:r,textEdit:Zt.replace(c,r),detail:`Project`,sortText:`0_`+s})}}},LikeC4DocumentHighlightProvider=class extends Pn{createDocumentHighlight(e){return si.create(e.segment.range,ci.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:zn(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let r=Vt(t.$cstNode,`value`)?.range,s=r&&this.resolveLink(e,t.value);if(s&&Er(s))return{range:r,target:s}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Er(t)||wr(t))return t;if(Sr(t))return yr(e.uri.toString(),`../`,t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return yr(r.toString(),t)}relativeLink(e,t){if(wr(t))return Cr(t);if(Sr(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),s=new URL(e.uri.toString());return Cr(br(new URL(t,s).toString(),r))}return null}};const fd=Y.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;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,r){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<rn.Linked&&(fd.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(rn.Linked,e.uri,r),fd.debug(`document is Linked`));let{parseResult:{value:{specifications:s,models:c,deployments:u,views:d,likec4lib:p}}}=e;return[...p.map(e=>()=>this.getLikec4LibSymbol(e)),...s.map(e=>()=>this.getSpecSymbol(e)),...c.map(e=>()=>this.getModelSymbol(e)),...u.map(e=>()=>this.getDeploymentModelSymbol(e)),...d.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(x);return r.length===0?[]:[{kind:Hn.Namespace,name:`icons`,range:t.range,selectionRange:an(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=Vt(t,`name`);if(!r)return[];let s=k([...e.elements,...e.tags,...e.relationships],w(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return logWarnError(e),null}nonexhaustive(e)}),M(x));return s.length===0?[]:[{kind:Hn.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:s}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Vt(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Vt(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){logWarnError(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,s=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:s.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=Vt(t,`name`);if(!r||!t)return[];let s=e.name,c=e.kind.$refText;return[{kind:this.symbolKind(e),name:s,range:t.range,selectionRange:r.range,detail:c,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=Vt(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||E(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||E(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||E(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 r=e.name?Vt(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){logWarnError(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let s=this.nameProvider.getNameStrict(e),c=e.kind.$refText;return[{kind:this.symbolKind(e),name:s,range:t.range,selectionRange:r.range,detail:c,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let s=kn(e),c=this.parser.forDocument(s).parseDeployedInstance(e),u=this.nameProvider.getNameStrict(e),d=`instance of `+c.element.model;return[{kind:this.symbolKind(e),name:u,range:t.range,selectionRange:r.range,detail:d,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const pd=`
100
100
  ---
101
- `;var LikeC4HoverProvider=class extends Vn{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){Y.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,s=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],c=preferSummary(r);c&&s.push(``,(c.md??c.txt).split(`
101
+ `;var LikeC4HoverProvider=class extends Bn{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){Y.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,s=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],c=preferSummary(r);c&&s.push(``,(c.md??c.txt).split(`
102
102
  `).join(`
103
103
  `));let u=this.services.likec4.LastSeen.model(t.projectId)?.findElement(r.id),d=u&&this.getElementModelHover(u,t.projectId);return s.push(d||`
104
104
  <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:s.join(`
105
- `)}}}getElementModelHover(e,t){let r=[],s=[...e.incoming(`direct`)].length,c=[...e.outgoing(`direct`)].length;(s>0||c>0)&&r.push(Xu,`<small>**${s}** incoming, **${c}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],s=R.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${s})`},u=[...e.scopedViews()].map(printViewLink);u.length>0&&r.push(Xu,`<small>Element views:</small>`,...u);let d=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(p);if(d.length>0){let e=u.length>0?`Also appears in views:`:`Appears in views:`;r.push(u.length>0?``:Xu,`<small>${e}</small>`,...d,` `)}return r.length>0?r.join(`
106
- `):void 0}getDeploymentNodeHover(e){let t=un(e),r=this.parser.forDocument(t).parseDeploymentNode(e),s=[r.id+` `];r.title!==e.name&&s.push(`### ${r.title}`),s.push("deployment node `"+r.kind+"` ");let c=preferSummary(r);return c&&s.push(``,c.md??c.txt),{contents:{kind:`markdown`,value:s.join(`
107
- `)}}}getDeployedInstanceHover(e){let t=un(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[s,c]=G.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],u=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[r.id+` `,`instance of \`${G.flatten(r.element)}\``];return u&&d.push(`### ${u.element.title}`,"element kind `"+u.element.kind+"` "),{contents:{kind:`markdown`,value:d.join(`
108
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};$n();const Zu=Y.getChild(`SemanticTokenProvider`),Qu={...On},$u={...In};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(s,c){if(c===`modifier`)return e=>(t.push(e),r);if(c in $u)return t.push($u[c]),r;if(c in Qu)return()=>e(Qu[c],t);throw Error(`Unknown semantic token type or modifier: ${c}`)}});return r}const ed=`Stop Highlighting`,stopHighlight=()=>{throw ed};var LikeC4SemanticTokenProvider=class extends Cn{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(isAnyOf(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(isAnyOf(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{T(e.node.value?.$refText)&&e.property(`value`).function()}),when(isAnyOf(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(isAnyOf(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{T(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(isAnyOf(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{T(e.node.kind)&&e.property(`kind`).definition.type()}),when(isAnyOf(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(isAnyOf(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{T(e.node.tag)&&e.property(`tag`).definition.type()}),when(isAnyOf(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{T(e.node.color)&&e.keyword(`color`).property()}),when(isAnyOf(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(isLinkProperty,e=>{T(e.node.value)&&e.property(`value`).string()}),when(isAnyOf(isColorProperty,isIconColorProperty),e=>{T(e.node.customColor)&&e.property(`customColor`).enum(),T(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!isAnyOf(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&T(e.key),e=>e.property(`key`).property()),when(isAnyOf(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{T(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(isAnyOf(isElement,isDeploymentNode,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:s}of this.rules)if(t(e))try{r??=this.mark(e),s(r)}catch(t){if(t===ed)return`prune`;Zu.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(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){let cst=t=>createSemanticTypeMethods((r,s)=>this.highlightToken({range:nonNullable(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:s})),keyword=t=>createSemanticTypeMethods((r,s)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:s})),property=(t,r)=>createSemanticTypeMethods((s,c)=>this.highlightProperty({node:e,property:t,type:s,modifier:c,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const td=isAnyOf(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=Y.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new Ze.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Gt(e.shared,Kt.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(Kt.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=Kt.IndexedContent)}get(e){return e.state<Kt.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:cn.basename(e.uri),state:e.state,expect:Kt.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){invariant(isElement(e)||isDeploymentElement(e));let t=Hl.readId(e);if(T(t))return t;let r=un(e);return r.state<Kt.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:cn.basename(r.uri)}),invariant(isLikeC4LangiumDocument(r)),this.get(r),nonNullable(Hl.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return Yn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return Yn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new Ye.default;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return Yn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let r=new Ye.default;for(let s of this.documents(e))for(let e of this.get(s).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return Yn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let r=new Ye.default,s=new Ye.default;for(let c of this.documents(e)){let e=this.get(c);for(let s of e.children(t))r.set(s.name,s);for(let r of e.descendants(t))s.set(r.name,r)}let c=uniqueByName(r),u=[...s.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...c,...sortNaturalByFqn(u)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(td));if(t.length===0)return nd.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),s=[],c=new Ye.default,u=new Ye.default,d=new Ye.default,p=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,s,c)=>{let u=Object.assign(p.createDescription(t,s,e),{id:c,likec4ProjectId:r});return Hl.writeId(t,c),d.set(c,u),u};function traverseElement(e,t){let r=Fqn(e.name,t),d=createAndSaveDescription(e,e.name,r);t?c.set(t,d):s.push(d);let p=F(e.body?.elements??[],td);if(!P(p,1))return[d];let m=I(p,e=>traverseElement(e,r));for(let e of m)u.set(r,e);return[d,...m]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=N(e.body?.elements??[],F(isElement),I(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of r)u.set(e,t)}for(let r of t)try{if(isExtendElement(r)){traverseExtendElement(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:cn.basename(e.uri),error:t})}return new nd(s,c,u,d,r)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>compareNatural(e.name,t.name))}var nd=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new Ye.default,new Ye.default,new Ye.default,Jl.DefaultProjectId);constructor(e,t,r,s,c){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=s,this.projectId=c}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 rd=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=Y.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(rd));if(t.length===0)return nd.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),s=[],c=new Ye.default,u=new Ye.default,d=new Ye.default,p=this.Names,m=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,s,c)=>{let u={...m.createDescription(t,s,e),id:c,likec4ProjectId:r};return Hl.writeId(t,c),d.set(c,u),u};function traverseElement(e,t){let r=p.getName(e);if(!T(r))return[];let d=Fqn(r,t),m=createAndSaveDescription(e,r,d);if(t?c.set(t,m):s.push(m),isDeployedInstance(e))return[m];let h=F(e.body?.elements??[],rd);if(!P(h,1))return[m];let g=I(h,e=>traverseElement(e,d));for(let e of g)u.set(d,e);return[m,...g]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=N(e.body?.elements??[],F(rd),I(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of r)u.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:cn.basename(e.uri),error:t})}return new nd(s,c,u,d,r)}};const id=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=id.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new Ye.default(Set);projectId;inferTechFromIcon;constructor(e,t){let r={},s=[];for(let t of e){let{c4Specification:e,c4Globals:c,c4Imports:u}=t,d=t.likec4ProjectId;p(d)&&(s.length===0||s[0]!==d)&&s.push(t.likec4ProjectId),Object.assign(r,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,c.predicates),Object.assign(this.globals.dynamicPredicates,c.dynamicPredicates),Object.assign(this.globals.styles,c.styles);for(let[e,t]of u)this.imports.set(e,t)}this.tags=assignTagColors(r),this.projectId=A(s),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:s,kind:c,title:u,description:d,technology:p,summary:m,metadata:h})=>{try{let g=this.specs.elements[c];if(!g)return Y.warn`No kind '${c}' found for ${s}`,null;p??=g.technology,d??=g.description,m??=g.summary,t??=g.links,y(u)&&(u=g.title||nameFromFqn(s)),g.tags&&isNonEmptyArray(g.tags)&&(e=e?le([...g.tags,...e]):g.tags);let _=exact({...g.style,...r});return!p&&this.inferTechFromIcon&&(p=deriveTechnologyFromIcon(_.icon)),exact({metadata:h&&!j(h)?h:void 0,notation:g.notation,style:_,links:t,tags:e,summary:m,technology:p,description:d,title:u,kind:c,id:s})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:r,kind:s,links:c,id:u,...d})=>{if(p(s)&&this.specs.relationships[s]){let{multiple:e,...p}=this.specs.relationships[s];return{...p,...d,...c&&{links:c},source:t,target:r,kind:s,id:u}}return{...c&&{links:c},...d,source:t,target:r,id:u}};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:G.flatten(e.element)};if(`element`in e)return Y.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return Y.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:s,title:c,...u}=e;return c=c===nameFromFqn(e.id)&&t.title?t.title:c,exact({...t,...u,title:c,style:exact({...t.style,...s}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:r,kind:s,links:c,id:u,...d})=>{if(p(s)&&this.specs.relationships[s]){let{multiple:e,...p}=this.specs.relationships[s];return{...p,...d,...c&&{links:c},source:t,target:r,kind:s,id:u}}return{...c&&{links:c},...d,source:t,target:r,id:u}}},LastSeenArtifacts=class extends ADisposable{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),_n.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,s=this.#t.get(t);return(!s||!s.equals(r))&&this.#t.set(t,r),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 assignNavigateTo(e){let t=new Map;for(let r of e)if(isElementView$1(r)&&r.viewOf&&k(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:s}of e)for(let e of s){let s=e.modelRef;if(e.navigateTo||!s)continue;let c=ue(t.get(s)??[],e=>e!==r);c&&(e.navigateTo=c)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let r={...e};for(let[e,s]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=s;continue}let c=Array.isArray(t)?t:[t],u=Array.isArray(s)?s:[s],d=le([...c,...u]);r[e]=d.length===1?d[0]:d}return r}merge(e){for(let t of e){let{id:e,links:r,tags:s,metadata:c}=t,u=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&u.links.push(...r),s&&(u.tags=le([...u.tags,...s])),c&&(u.metadata=this.mergeMetadata(u.metadata,c)),this.mergedData.set(e,u)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let s=t.tags;e.tags&&e.tags.length>0&&(s=le([...e.tags,...s]));let c=t.metadata;return e.metadata&&(c=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:P(s,1)?s:null,links:P(r,1)?r:null,...!j(c)&&{metadata:c}}}};function buildModelData(e,t,r){let s=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});s.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(s);let c=g(s.specs.colors,e=>computeColorValues(e.color)),u=new Set,p=new MergedExtends,m=new MergedExtends,h=r.flatMap(e=>e.c4ExtendRelations),_=new Set,scanMetadataKeys=e=>{e?.metadata&&d(e.metadata).forEach(e=>u.add(e))},v=N(r,I(e=>(p.merge(e.c4ExtendElements),D(e.c4Elements,s.toModelElement))),F(T),sortParentsFirst,Me((e,t)=>{let r=parentFqn(t.id);return r&&k(e[r])?(Y.debug`No parent found for ${t.id}`,e):(e[t.id]=p.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),y=N(r,I(e=>D(e.c4Relations,s.toModelRelation)),F(e=>{if(!e)return!1;let t=G.flatten(e.source),r=G.flatten(e.target);return k(v[t])&&!isGlobalFqn(t)||k(v[r])&&!isGlobalFqn(r)?(Y.debug`Invalid relation ${e.id}
109
- source: ${t} resolved: ${!!v[t]}
110
- target: ${r} resolved: ${!!v[r]}\n`,!1):!0}),D(e=>{let t=stringHash(`extend-relation`,G.flatten(e.source),G.flatten(e.target),e.kind??`default`,e.title??``),r=h.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>_.add(e.astPath));let s=e.tags?[...e.tags]:[],c=e.links?[...e.links]:[],u=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&s.push(...e.tags),e.links)for(let t of e.links)c.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||c.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=u[t];if(e===void 0)u[t]=r;else{let s=Array.isArray(e)?e:[e],c=Array.isArray(r)?r:[r],d=le([...s,...c]);u[t]=d.length===1?d[0]:d}}}let d=le(s),p=c;return{...e,...P(d,1)&&{tags:d},...P(p,1)&&{links:p},...!j(u)&&{metadata:u}}}),he(scanMetadataKeys),Pe(M(`id`))),b=N(r,I(e=>(m.merge(e.c4ExtendDeployments),D(e.c4Deployments,s.toDeploymentElement))),F(T),sortParentsFirst,Me((e,t)=>{let r=parentFqn(t.id);return r&&k(e[r])?(Y.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=isDeploymentNode$1(t)?m.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),x=N(r,I(e=>D(e.c4DeploymentRelations,s.toDeploymentRelation)),F(e=>e?k(b[e.source.deployment])||k(b[e.target.deployment])?(Y.debug`Invalid deployment relation ${e.id}
111
- source: ${e.source.deployment} resolved: ${!!b[e.source.deployment]}
112
- target: ${e.target.deployment} resolved: ${!!b[e.target.deployment]}\n`,!1):!0:!1),Me((e,t)=>ie(e[t.id])?(Y.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:s,title:c,description:u,astPath:d,...p}=e;return e._type===`element`&&k(c)&&`viewOf`in e&&(c=v[e.viewOf]?.title??null),k(c)&&s===`index`&&(c=`Landscape view`),{...We(p,e=>e===void 0),[Ri]:`parsed`,sourcePath:cn.relative(t.folderUri,r),docUri:r,description:u,title:c,id:s}}}let S=r.flatMap(e=>D(e.c4Views,toC4View(e)));if(S.some(e=>e.id===`index`)||S.unshift({[Ri]:`parsed`,[zi]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of S)t._type===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(S.map(e=>e.id));for(let r of d(v)){if(e.has(r)||isGlobalFqn(r))continue;let s=`__`+r.replaceAll(`.`,`_`);t.has(s)||(t.add(s),S.push({[Ri]:`parsed`,[zi]:`element`,id:s,viewOf:r,title:`Auto / ${(v[r]?.title??r).replaceAll(`
113
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let w=N(S,Pe(M(`id`)));S.some(isExtendsElementView)&&(w=resolveRulesExtendedViews(w));for(let e of h)_.has(e.astPath)||Y.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Ri]:`parsed`,projectId:t.id,project:exact({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:s.tags,elements:s.specs.elements,relationships:g(s.specs.relationships,({notation:e,technology:t,...r})=>({...e&&{notation:e},...t&&{technology:t},style:r})),deployments:s.specs.deployments,...u.size>0&&{metadataKeys:[...u].sort(compareNatural)},customColors:c},elements:v,relations:y,globals:s.globals,views:w,deployments:{elements:b,relations:x},imports:{}},imports:s.imports}}const ad=Y.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{services;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.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new ProjectModelCache(e),this.onDispose(this.cache,_n.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=He(x(),F(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),D(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(Kt.Validated,(e,r)=>{let s=t(e);s.length>0&&this.notifyListeners(s)})),ad.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=ad.getChild(e);try{let r=this.projects.getProject(e),s=this.documents(e);return s.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,r,s))}catch(t){return ad.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=ad.getChild(e),r=this.unsafeSyncParseModelData(e);if(!r)return null;if(r.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),r.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let s=[...r.imports.associations()].reduce((e,[t,r])=>{if(r.size===0)return e;let s=this.unsafeSyncParseModelData(t);if(s){let c=[...r].flatMap(e=>s.data.elements[e]??[]);P(c,1)&&(e[t]=structuredClone(c))}return e},{});return{...r.data,imports:s}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await Zt(t),this.cache.parsedModel(e,()=>{let t=ad.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?Ea.create(r):(t.debug`parseModel: returning EMPTY`,Ea.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let r=ad.getChild(e),s=this.unsafeSyncJoinedModelData(e);if(!s)return e!==Jl.DefaultProjectId&&r.warn`unsafeSyncComputeModel: returning EMPTY`,Ea.EMPTY.asComputed;let c=performanceMark(),u=Ea.create(s),d=[];for(let e of Fe(s.views)){let s=computeView(e,u);if(!s.isSuccess){r.warn(loggable(s.error));continue}t?.views[e.id]&&Object.assign(s.view,{hasManualLayout:!0}),d.push(s.view)}assignNavigateTo(d);let p={...s,manualLayouts:{...t?.views},[Ri]:`computed`,views:Pe(d,M(`id`))};return r.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${c.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(Ea.create(p))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=ad.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Zt(t);let s=this.projects.getProject(e),c=await this.manualLayouts.read(s),u=this.unsafeSyncComputeModel(e,c);return u===Ea.EMPTY&&e!==Jl.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),u})}onModelParsed(e){return this.listeners.push(e),_n.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){ad.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;if(S(e)){if(t=N(e,se(e=>this.projects.ownerProjectId(e)),Re()),y(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[r,s]of t)try{e(r,s)}catch(e){ad.warn(loggable(e))}}},ProjectModelCache=class extends er{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(Kt.Validated,t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(r)}),e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,s=le(D(r,t.ownerProjectId.bind(t)));if(!P(s,1))return;ad.trace`clear project caches for: ${s} (on delete ${r.map(e=>e.fsPath)})`;for(let e of s)this.clear(e)}}))}parsedData(e,t){let r=`parsed-data`,s=this.get(e,r);if(s!==void 0)return ad.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),ad.trace`cache miss project ${e} key: ${r}`,c}parsedJoinedData(e,t){let r=`parsed-joined-data`,s=this.get(e,r);if(s!==void 0)return ad.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),ad.trace`cache miss project ${e} key: ${r}`,c}parsedModel(e,t){let r=`parsed-model`,s=this.get(e,r);if(s!==void 0)return ad.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),ad.trace`cache miss project ${e} key: ${r}`,c}computedModel(e,t,r){let s=t?`computed-model-${t.hash}`:`computed-model`,c=this.get(e,s);if(c!==void 0)return ad.trace`cache hit project ${e} key: ${s}`,c;let u=r();return this.set(e,s,u),ad.trace`cache miss project ${e} key: ${s}`,u}};const{findNodeForKeyword:od,findNodeForProperty:sd}=Un,{getDocument:cd,streamAllContents:ld}=Yt,ud=Y.getChild(`locator`);var LikeC4ModelLocator=class{services;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,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=E(t)?this.projects.ensureProjectId():projectIdFrom(t)),E(t)){let e=t,s=this.fqnIndex.byFqn(r,e).head();if(!s)return null;let c=this.langiumDocuments.getDocument(s.documentUri),u=this.findParsedElementByFqnIn(e,c);return u&&c?{projectId:r,element:u,document:c}:null}let s=this.fqnIndex.getFqn(t),c=cd(t),u=this.findParsedElementByFqnIn(s,c);return u&&c?{projectId:r,element:u,document:c}:null}catch(e){return ud.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[r,s]=splitGlobalFqn(e);r??=this.projects.ensureProjectId(t);let c=this.fqnIndex.byFqn(r,s).head(),u=c?.nameSegment??c?.selectionSegment;return!c||!u?null:{uri:c.documentUri.toString(),range:u.range}}locateDeploymentElement(e,t){let r=this.projects.ensureProjectId(t),s=e,c=this.deploymentsIndex.byFqn(r,s).head(),u=c?.nameSegment??c?.selectionSegment;return!c||!u?null:{uri:c.documentUri.toString(),range:u.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(s)&&!isDeploymentRelation(s))continue;let c=s.kind?sd(s.$cstNode,`kind`):void 0;if(c??=s.dotKind?sd(s.$cstNode,`dotKind`):void 0,c??=od(s.$cstNode,`->`),c??=sd(s.$cstNode,`title`),c??=sd(s.$cstNode,`target`),c??=s.$cstNode,c)return{uri:t.uri.toString(),range:{start:c.range.start,end:c.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(s))return{doc:t,view:r,viewAst:s}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let s=r.viewAst,c=s.name?sd(s.$cstNode,`name`):void 0;return c??=od(s.$cstNode,`view`),c??=s.$cstNode,c?{uri:r.doc.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<Kt.Linked&&(ud.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Kt.Linked,r.uri,t));let s=projectIdFrom(r);ud.trace`locate document tags for ${r.uri.fsPath} in project ${s}`;try{let e=this.services.likec4.LastSeen.specification(s)?.tags,t=this.services.likec4.LastSeen.styles(s)??Ji.DEFAULT;if(!e)return ud.trace(`No specification or styles found for project ${s}, cannot locate tags for document ${r.uri.fsPath}`),null;let c=N(ld(r.parseResult.value),ifilter(e=>isTag(e)||isTagRef(e)),toArray(),I(r=>{let s,c;try{isTag(r)?(s=r.name,c=r.$cstNode):(s=r.tag.$refText,c=r.tag.$refNode);let u=e[s];return invariant(u,`Tag ${s} not found in merged specification`),invariant(c,`Tag ${s} does not have a $cstNode`),{name:s,color:t.tagColor(u.color).fill,range:c.range,isSpecification:isTag(r)}}catch(e){return ud.warn(`Fail on tag ${s}`,{err:e}),[]}}));return ud.debug(`Found ${c.length} tags in document ${r.uri.path}`),c}catch(e){return ud.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView(r)||!r.body)return ud.warn(`View ${e.view} is not a dynamic view`),null;let s=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,c=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,s);if(!c||!isDynamicViewStep(c))return ud.warn(`Failed to locate dynamic view step ${s} in view ${e.view}`),null;let u=c.kind?sd(c.$cstNode,`kind`):void 0;return u??=c.dotKind?sd(c.$cstNode,`dotKind`):void 0,u??=od(c.$cstNode,`->`),u??=od(c.$cstNode,`<-`),u??=sd(c.$cstNode,`title`),u??=sd(c.$cstNode,`target`),u??=c.$cstNode,u?{uri:t.uri.toString(),range:{start:u.range.start,end:u.range.start}}:null}};function stripIndent(e){let t=e.match(/^[ \t]*(?=\S)/gm);if(!t)return e;let r=1/0;for(let e of t)r=Math.min(r,e.length);return r===0||r===1/0?e:e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``)}function dedent(e){return stripIndent(e.replace(/^(?:[ \t]*\r?\n)+|(?:\r?\n[ \t]*)+$/g,``))}const dd=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,s){try{let c=e(t,r,s);_(c)&&await c;return}catch(e){let s=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${s}`,{node:t}),Y.debug(`Validation failed: ${s}`,{error:e})}}}const{getDocument:fd}=Yt,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,s)=>{let c=r.getName(e);if(!c){s(`error`,`DeploymentNode must be named`,{node:e});return}let u=nonNullable(r.getNameNode(e),`name CstNode not found`).range;dd.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:e,range:u});let d=projectIdFrom(e),p=t.getFqn(e);t.byFqn(d,p).limit(2).toArray().length>1&&s(`error`,`Duplicate node name "${p}"`,{node:e,range:u})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,s)=>{let c=r.getName(e);if(!c){s(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let u=nonNullable(r.getNameNode(e),`name CstNode not found`).range;dd.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:e,range:u});let d=projectIdFrom(e),p=t.getFqn(e);t.byFqn(d,p).limit(2).toArray().length>1&&s(`error`,`Duplicate instance name "${p}"`,{node:e,range:u})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let s=fd(e),c=t.forDocument(s),u;try{u=c._resolveDeploymentRelationSource(e)}catch(t){Y.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(G.isImportRef(u)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(G.isModelRef(u)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let d=c.parseFqnRef(e.target);if(G.isImportRef(d)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(G.isModelRef(d)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}isSameHierarchy(u.deployment,d.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;(!r||!isDeploymentNode(r))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let s=elementRef(e.source),c=s&&t.getFqn(s);c||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let u=elementRef(e.target),d=u&&t.getFqn(u);d||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),c&&d&&(isAncestor(c,d)||isAncestor(d,c))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},dynamicViewStepChain=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let s=e.source;isDynamicStepSingle(s)&&s.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let c=elementRef(e.target);c&&t.getFqn(c)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},dynamicViewParallelSteps=e=>tryOrLog((e,t)=>{for(let r of e.steps)isDynamicViewParallelSteps(r)&&t(`error`,`Nested parallel blocks are not allowed`,{node:r})}),dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(j(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}fn(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:pd}=Yt,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator;return tryOrLog((e,s)=>{let c=t.getFqn(e);if(!c){s(`error`,`Not indexed element`,{node:e,property:`name`});return}dd.includes(e.name)&&s(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let u=pd(e),d=u.uri,p=r.getAstNodePath(e),m=t.byFqn(projectIdFrom(u),c).filter(e=>e.documentUri!==d||e.path!==p).head();if(m){let t=m.documentUri!==d;s(`error`,`Duplicate element name ${e.name===c?e.name:e.name+` (`+c+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:m.nameSegment?.range??m.selectionSegment?.range,uri:m.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:md}=Yt,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let s=projectIdFrom(md(e));if(e.project===s){r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(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`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||E(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=w(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==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((!w(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!w(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!w(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),w(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),E(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}nonexhaustive(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=t.forDocument(un(e)),c=safeCall(()=>s._resolveRelationSource(e));if(!c){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let u=safeCall(()=>s.parseFqnRef(e.target));if(!u){r(`error`,`Target not resolved`,{node:e,property:`target`});return}G.isImportRef(c)&&(G.isImportRef(u)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),isSameHierarchy(G.flatten(c),G.flatten(u))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new Gt(e.shared,Kt.Linked),calcFingerprint=({source:e,target:t,kind:r,title:s})=>stringHash(`extend-relation`,G.flatten(e),G.flatten(t),r??`default`,s??``);function getProjectFingerprints(t){return r.get(t,()=>new Set(N(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),I(e=>e.c4Relations??[]),D(e=>calcFingerprint(e)))))}return tryOrLog((e,r)=>{let s=un(e),c=t.forDocument(s),u=safeCall(()=>c.parseFqnRef(e.source));if(!u){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let d=safeCall(()=>c.parseFqnRef(e.target));if(!d){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!G.isModelRef(u)&&!G.isImportRef(u)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!G.isModelRef(d)&&!G.isImportRef(d)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let p=projectIdFrom(s),m=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:h=``}=c.parseBaseProps({},{title:e.title}),g=calcFingerprint({source:u,target:d,kind:m,title:h});getProjectFingerprints(p).has(g)||r(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{dd.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e),c=t.projectElements(s,Rs).filter(t=>t.name===e.name&&t.node!==e).head();if(c){let t=c.documentUri!==un(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{dd.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e),c=t.projectElements(s,xs).filter(t=>t.name===e.name&&t.node!==e).head();if(c){let t=c.documentUri!==un(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=e.name,c=projectIdFrom(e),u=t.projectElements(c,`Tag`).filter(t=>t.name===s&&t.node!==e).head();if(u){let t=u.documentUri!==un(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:u.nameSegment.range,uri:u.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{dd.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e);t.projectElements(s,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=projectIdFrom(e),c=t.projectElements(s,oc),u=t.projectElements(s,ac);c.concat(u).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=projectIdFrom(e);t.projectElements(s,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},hd=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=Bt(e.$cstNode,[`BLOCK_COMMENT`]);if(s&&hd.test(s.text)&&r(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:s.range}),!e.name)return;dd.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let c=projectIdFrom(e);t.projectElements(c,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let s=r.filter(isFqnRefExpr),c=s[0]?.ref?.parent;for(let r=1;r<s.length;r++){let u=s[r];e.value===`same`&&!areSame(c,u?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=getViewRulePredicateContainer(e);if(s?.$type!==`DynamicViewIncludePredicate`&&s?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let c=s.$type===`DynamicViewIncludePredicate`,u=t.forDocument(un(s)),d=K.unwrap(u.parseFqnExprWith(e).custom.expr);switch(!0){case K.isWildcard(d)&&c:case K.isElementKindExpr(d)&&c:case K.isElementTagExpr(d)&&c:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case K.isWildcard(d):case K.isModelRef(d):case K.isDeploymentRef(d):return;case K.isElementKindExpr(d):case K.isElementTagExpr(d):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:nonexhaustive(d)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=t.forDocument(un(e)).parseFqnRefExpr(e),c=getViewRulePredicateContainer(e),u=isFqnRefInsideDeployment(e)&&!fn(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(c?.$type===`DeploymentViewRulePredicate`||u){if(!fn(e,isRelationExpr)){if(K.isModelRef(s)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(K.isDeploymentRef(s)&&G.isInsideInstanceRef(s.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}T(e.selector)&&!isDeploymentNode(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(c?.$type===`DynamicViewIncludePredicate`)switch(!0){case K.isElementKindExpr(s):case K.isElementTagExpr(s):case K.isWildcard(s):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)&&k(dn(e,isElementView)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=dn(e,isElementView);r&&k(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=dn(e,isDeploymentViewRulePredicate);if(!s||s.isInclude!==!0)return;let c=un(e),u=t.forDocument(c),d=Hi.unwrap(u.parseRelationExpr(e)),p=`Model reference is allowed in exclude predicate only`;if(Hi.isDirect(d)){(K.isModelRef(d.source)||K.isModelRef(d.target))&&r(`error`,p,{node:e});return}let m;if(m=Hi.isIncoming(d)?d.incoming:Hi.isOutgoing(d)?d.outgoing:d.inout,K.isModelRef(m)){r(`error`,p,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);if(!(!r||r.$type==`DynamicViewIncludePredicate`)&&!r.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends Dn{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};$n();const gd=isAnyOf(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isDynamicViewParallelSteps,isDynamicStepChain,isDynamicStepSingle,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(gd(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=Kt.Validated?e.diagnostics?.filter(e=>e.severity===Zn.Error)??[]:[],r=new WeakSet;for(let{node:e}of t){if(k(e)||r.has(e))continue;r.add(e);let t=findInvalidContainer(e);t&&r.add(t)}let isValid=e=>!r.has(e);return{isValid,invalidNodes:r}}function registerValidationChecks(e){Y.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),DynamicStepSingle:dynamicViewStepSingle(e),DynamicStepChain:dynamicViewStepChain(e),DynamicViewParallelSteps:dynamicViewParallelSteps(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e)});let t=e.shared.lsp.Connection;t&&onNextTick(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)Y.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>Y.error(loggable(e)))})})}const _d=Y.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return E(t)?t.split(`
105
+ `)}}}getElementModelHover(e,t){let r=[],s=[...e.incoming(`direct`)].length,c=[...e.outgoing(`direct`)].length;(s>0||c>0)&&r.push(pd,`<small>**${s}** incoming, **${c}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],s=fn.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${s})`},u=[...e.scopedViews()].map(printViewLink);u.length>0&&r.push(pd,`<small>Element views:</small>`,...u);let d=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(ce);if(d.length>0){let e=u.length>0?`Also appears in views:`:`Appears in views:`;r.push(u.length>0?``:pd,`<small>${e}</small>`,...d,` `)}return r.length>0?r.join(`
106
+ `):void 0}getDeploymentNodeHover(e){let t=kn(e),r=this.parser.forDocument(t).parseDeploymentNode(e),s=[r.id+` `];r.title!==e.name&&s.push(`### ${r.title}`),s.push("deployment node `"+r.kind+"` ");let c=preferSummary(r);return c&&s.push(``,c.md??c.txt),{contents:{kind:`markdown`,value:s.join(`
107
+ `)}}}getDeployedInstanceHover(e){let t=kn(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[s,c]=G.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],u=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[r.id+` `,`instance of \`${G.flatten(r.element)}\``];return u&&d.push(`### ${u.element.title}`,"element kind `"+u.element.kind+"` "),{contents:{kind:`markdown`,value:d.join(`
108
+ `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};const md=Y.getChild(`SemanticTokenProvider`),hd={...Qt},gd={...Jt};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(s,c){if(c===`modifier`)return e=>(t.push(e),r);if(c in gd)return t.push(gd[c]),r;if(c in hd)return()=>e(hd[c],t);throw Error(`Unknown semantic token type or modifier: ${c}`)}});return r}const _d=`Stop Highlighting`,stopHighlight=()=>{throw _d};var LikeC4SemanticTokenProvider=class extends wn{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(isAnyOf(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(isAnyOf(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{x(e.node.value?.$refText)&&e.property(`value`).function()}),when(isAnyOf(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(isAnyOf(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{x(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(isAnyOf(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{x(e.node.kind)&&e.property(`kind`).definition.type()}),when(isAnyOf(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(isAnyOf(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{x(e.node.tag)&&e.property(`tag`).definition.type()}),when(isAnyOf(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{x(e.node.color)&&e.keyword(`color`).property()}),when(isAnyOf(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(isLinkProperty,e=>{x(e.node.value)&&e.property(`value`).string()}),when(isAnyOf(isColorProperty,isIconColorProperty),e=>{x(e.node.customColor)&&e.property(`customColor`).enum(),x(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!isAnyOf(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&x(e.key),e=>e.property(`key`).property()),when(isAnyOf(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{x(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(isAnyOf(isElement,isDeploymentNode,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:s}of this.rules)if(t(e))try{r??=this.mark(e),s(r)}catch(t){if(t===_d)return`prune`;md.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(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){let cst=t=>createSemanticTypeMethods((r,s)=>this.highlightToken({range:nonNullable(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:s})),keyword=t=>createSemanticTypeMethods((r,s)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:s})),property=(t,r)=>createSemanticTypeMethods((s,c)=>this.highlightProperty({node:e,property:t,type:s,modifier:c,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const vd=isAnyOf(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=Y.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new it.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new cn(e.shared,rn.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(rn.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=rn.IndexedContent)}get(e){return e.state<rn.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:pn.basename(e.uri),state:e.state,expect:rn.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){invariant(isElement(e)||isDeploymentElement(e));let t=uu.readId(e);if(x(t))return t;let r=kn(e);return r.state<rn.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:pn.basename(r.uri)}),invariant(isLikeC4LangiumDocument(r)),this.get(r),nonNullable(uu.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return Nn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return Nn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new nt.default;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return Nn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let r=new nt.default;for(let s of this.documents(e))for(let e of this.get(s).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return Nn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let r=new nt.default,s=new nt.default;for(let c of this.documents(e)){let e=this.get(c);for(let s of e.children(t))r.set(s.name,s);for(let r of e.descendants(t))s.set(r.name,r)}let c=uniqueByName(r),u=[...s.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...c,...sortNaturalByFqn(u)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(vd));if(t.length===0)return yd.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),s=[],c=new nt.default,u=new nt.default,d=new nt.default,p=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,s,c)=>{let u=Object.assign(p.createDescription(t,s,e),{id:c,likec4ProjectId:r});return uu.writeId(t,c),d.set(c,u),u};function traverseElement(e,t){let r=Fqn(e.name,t),d=createAndSaveDescription(e,e.name,r);t?c.set(t,d):s.push(d);let p=M(e.body?.elements??[],vd);if(!j(p,1))return[d];let m=A(p,e=>traverseElement(e,r));for(let e of m)u.set(r,e);return[d,...m]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=k(e.body?.elements??[],M(isElement),A(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of r)u.set(e,t)}for(let r of t)try{if(isExtendElement(r)){traverseExtendElement(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:pn.basename(e.uri),error:t})}return new yd(s,c,u,d,r)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>compareNatural(e.name,t.name))}var yd=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new nt.default,new nt.default,new nt.default,hu.DefaultProjectId);constructor(e,t,r,s,c){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=s,this.projectId=c}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 bd=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=Y.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(bd));if(t.length===0)return yd.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),s=[],c=new nt.default,u=new nt.default,d=new nt.default,p=this.Names,m=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,s,c)=>{let u={...m.createDescription(t,s,e),id:c,likec4ProjectId:r};return uu.writeId(t,c),d.set(c,u),u};function traverseElement(e,t){let r=p.getName(e);if(!x(r))return[];let d=Fqn(r,t),m=createAndSaveDescription(e,r,d);if(t?c.set(t,m):s.push(m),isDeployedInstance(e))return[m];let h=M(e.body?.elements??[],bd);if(!j(h,1))return[m];let g=A(h,e=>traverseElement(e,d));for(let e of g)u.set(d,e);return[m,...g]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=k(e.body?.elements??[],M(bd),A(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of r)u.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:pn.basename(e.uri),error:t})}return new yd(s,c,u,d,r)}};const xd=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=xd.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new nt.default(Set);projectId;inferTechFromIcon;constructor(e,t){let r={},s=[];for(let t of e){let{c4Specification:e,c4Globals:c,c4Imports:u}=t,d=t.likec4ProjectId;ce(d)&&(s.length===0||s[0]!==d)&&s.push(t.likec4ProjectId),Object.assign(r,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,c.predicates),Object.assign(this.globals.dynamicPredicates,c.dynamicPredicates),Object.assign(this.globals.styles,c.styles);for(let[e,t]of u)this.imports.set(e,t)}this.tags=assignTagColors(r),this.projectId=T(s),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:s,kind:c,title:u,description:d,technology:p,summary:m,metadata:h})=>{try{let g=this.specs.elements[c];if(!g)return Y.warn`No kind '${c}' found for ${s}`,null;p??=g.technology,d??=g.description,m??=g.summary,t??=g.links,se(u)&&(u=g.title||nameFromFqn(s)),g.tags&&isNonEmptyArray(g.tags)&&(e=e?pe([...g.tags,...e]):g.tags);let _=exact({...g.style,...r});return!p&&this.inferTechFromIcon&&(p=deriveTechnologyFromIcon(_.icon)),exact({metadata:h&&!E(h)?h:void 0,notation:g.notation,style:_,links:t,tags:e,summary:m,technology:p,description:d,title:u,kind:c,id:s})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:r,kind:s,links:c,id:u,title:d,tags:p,...m})=>{if(ce(s)&&this.specs.relationships[s]){let{multiple:e,tags:h,...g}=this.specs.relationships[s];return h&&isNonEmptyArray(h)&&(p=p?pe([...h,...p]):h),{...g,...m,...c&&{links:c},...p&&{tags:p},title:se(d)?g.title??d:d,source:t,target:r,kind:s,id:u}}return{...c&&{links:c},...m,...p&&{tags:p},title:d,source:t,target:r,id:u}};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:G.flatten(e.element)};if(`element`in e)return Y.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return Y.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:s,title:c,...u}=e;return c=c===nameFromFqn(e.id)&&t.title?t.title:c,exact({...t,...u,title:c,style:exact({...t.style,...s}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:r,kind:s,links:c,id:u,tags:d,...p})=>{if(ce(s)&&this.specs.relationships[s]){let{multiple:e,tags:m,...h}=this.specs.relationships[s];return m&&isNonEmptyArray(m)&&(d=d?pe([...m,...d]):m),{...h,...p,...c&&{links:c},...d&&{tags:d},source:t,target:r,kind:s,id:u}}return{...c&&{links:c},...p,...d&&{tags:d},source:t,target:r,id:u}}},LastSeenArtifacts=class extends ADisposable{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),er.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,s=this.#t.get(t);return(!s||!s.equals(r))&&this.#t.set(t,r),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 assignNavigateTo(e){let t=new Map;for(let r of e)if(isElementView$1(r)&&r.viewOf&&N(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:s}of e)for(let e of s){let s=e.modelRef;if(e.navigateTo||!s)continue;let c=je(t.get(s)??[],e=>e!==r);c&&(e.navigateTo=c)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let r={...e};for(let[e,s]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=s;continue}let c=Array.isArray(t)?t:[t],u=Array.isArray(s)?s:[s],d=pe([...c,...u]);r[e]=d.length===1?d[0]:d}return r}merge(e){for(let t of e){let{id:e,links:r,tags:s,metadata:c}=t,u=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&u.links.push(...r),s&&(u.tags=pe([...u.tags,...s])),c&&(u.metadata=this.mergeMetadata(u.metadata,c)),this.mergedData.set(e,u)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let s=t.tags;e.tags&&e.tags.length>0&&(s=pe([...e.tags,...s]));let c=t.metadata;return e.metadata&&(c=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:j(s,1)?s:null,links:j(r,1)?r:null,...!E(c)&&{metadata:c}}}};function buildModelData(e,t,r){let s=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});s.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(s);let c=h(s.specs.colors,e=>computeColorValues(e.color)),d=new Set,p=new MergedExtends,m=new MergedExtends,g=r.flatMap(e=>e.c4ExtendRelations),v=new Set,scanMetadataKeys=e=>{e?.metadata&&u(e.metadata).forEach(e=>d.add(e))},y=k(r,A(e=>(p.merge(e.c4ExtendElements),w(e.c4Elements,s.toModelElement))),M(x),sortParentsFirst,Re((e,t)=>{let r=parentFqn(t.id);return r&&N(e[r])?(Y.debug`No parent found for ${t.id}`,e):(e[t.id]=p.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),ee=k(r,A(e=>w(e.c4Relations,s.toModelRelation)),M(e=>{if(!e)return!1;let t=G.flatten(e.source),r=G.flatten(e.target);return N(y[t])&&!isGlobalFqn(t)||N(y[r])&&!isGlobalFqn(r)?(Y.debug`Invalid relation ${e.id}
109
+ source: ${t} resolved: ${!!y[t]}
110
+ target: ${r} resolved: ${!!y[r]}\n`,!1):!0}),w(e=>{let t=stringHash(`extend-relation`,G.flatten(e.source),G.flatten(e.target),e.kind??`default`,e.title??``),r=g.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>v.add(e.astPath));let s=e.tags?[...e.tags]:[],c=e.links?[...e.links]:[],u=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&s.push(...e.tags),e.links)for(let t of e.links)c.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||c.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=u[t];if(e===void 0)u[t]=r;else{let s=Array.isArray(e)?e:[e],c=Array.isArray(r)?r:[r],d=pe([...s,...c]);u[t]=d.length===1?d[0]:d}}}let d=pe(s),p=c;return{...e,...j(d,1)&&{tags:d},...j(p,1)&&{links:p},...!E(u)&&{metadata:u}}}),Ve(scanMetadataKeys),b(D(`id`))),te=k(r,A(e=>(m.merge(e.c4ExtendDeployments),w(e.c4Deployments,s.toDeploymentElement))),M(x),sortParentsFirst,Re((e,t)=>{let r=parentFqn(t.id);return r&&N(e[r])?(Y.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=isDeploymentNode$1(t)?m.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),S=k(r,A(e=>w(e.c4DeploymentRelations,s.toDeploymentRelation)),M(e=>e?N(te[e.source.deployment])||N(te[e.target.deployment])?(Y.debug`Invalid deployment relation ${e.id}
111
+ source: ${e.source.deployment} resolved: ${!!te[e.source.deployment]}
112
+ target: ${e.target.deployment} resolved: ${!!te[e.target.deployment]}\n`,!1):!0:!1),Re((e,t)=>_(e[t.id])?(Y.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:s,title:c,description:u,astPath:d,...p}=e;return e._type===`element`&&N(c)&&`viewOf`in e&&(c=y[e.viewOf]?.title??null),N(c)&&s===`index`&&(c=`Landscape view`),{...Ye(p,e=>e===void 0),[Wi]:`parsed`,sourcePath:pn.relative(t.folderUri,r),docUri:r,description:u,title:c,id:s}}}let ne=r.flatMap(e=>w(e.c4Views,toC4View(e)));if(ne.some(e=>e.id===`index`)||ne.unshift({[Wi]:`parsed`,[Gi]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of ne)t._type===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(ne.map(e=>e.id));for(let r of u(y)){if(e.has(r)||isGlobalFqn(r))continue;let s=`__`+r.replaceAll(`.`,`_`);t.has(s)||(t.add(s),ne.push({[Wi]:`parsed`,[Gi]:`element`,id:s,viewOf:r,title:`Auto / ${(y[r]?.title??r).replaceAll(`
113
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let re=k(ne,b(D(`id`)));ne.some(isExtendsElementView)&&(re=resolveRulesExtendedViews(re));for(let e of g)v.has(e.astPath)||Y.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Wi]:`parsed`,projectId:t.id,project:exact({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:s.tags,elements:s.specs.elements,relationships:h(s.specs.relationships,({notation:e,technology:t,...r})=>({...e&&{notation:e},...t&&{technology:t},style:r})),deployments:s.specs.deployments,...d.size>0&&{metadataKeys:[...d].sort(compareNatural)},customColors:c},elements:y,relations:ee,globals:s.globals,views:re,deployments:{elements:te,relations:S},imports:{}},imports:s.imports}}const Sd=Y.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{services;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.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new ProjectModelCache(e),this.onDispose(this.cache,er.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=qe(ue(),M(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),w(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(rn.Validated,(e,r)=>{let s=t(e);s.length>0&&this.notifyListeners(s)})),Sd.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=Sd.getChild(e);try{let r=this.projects.getProject(e),s=this.documents(e);return s.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,r,s))}catch(t){return Sd.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=Sd.getChild(e),r=this.unsafeSyncParseModelData(e);if(!r)return null;if(r.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),r.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let s=[...r.imports.associations()].reduce((e,[t,r])=>{if(r.size===0)return e;let s=this.unsafeSyncParseModelData(t);if(s){let c=[...r].flatMap(e=>s.data.elements[e]??[]);j(c,1)&&(e[t]=structuredClone(c))}return e},{});return{...r.data,imports:s}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await Xt(t),this.cache.parsedModel(e,()=>{let t=Sd.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?za.create(r):(t.debug`parseModel: returning EMPTY`,za.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let r=Sd.getChild(e),s=this.unsafeSyncJoinedModelData(e);if(!s)return e!==hu.DefaultProjectId&&r.warn`unsafeSyncComputeModel: returning EMPTY`,za.EMPTY.asComputed;let c=performanceMark(),u=za.create(s),d=[];for(let e of Be(s.views)){let s=computeView(e,u);if(!s.isSuccess){r.warn(loggable(s.error));continue}t?.views[e.id]&&Object.assign(s.view,{hasManualLayout:!0}),d.push(s.view)}assignNavigateTo(d);let p={...s,manualLayouts:{...t?.views},[Wi]:`computed`,views:b(d,D(`id`))};return r.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${c.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(za.create(p))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=Sd.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Xt(t);let s=this.projects.getProject(e),c=await this.manualLayouts.read(s),u=this.unsafeSyncComputeModel(e,c);return u===za.EMPTY&&e!==hu.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),u})}onModelParsed(e){return this.listeners.push(e),er.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Sd.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){if(this.listeners.length===0)return;let t;if(ze(e)){if(t=k(e,re(e=>this.projects.ownerProjectId(e)),be()),se(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[r,s]of t)try{e(r,s)}catch(e){Sd.warn(loggable(e))}}},ProjectModelCache=class extends Wt{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(rn.Validated,t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(r)}),e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,s=pe(w(r,t.ownerProjectId.bind(t)));if(!j(s,1))return;Sd.trace`clear project caches for: ${s} (on delete ${r.map(e=>e.fsPath)})`;for(let e of s)this.clear(e)}}))}parsedData(e,t){let r=`parsed-data`,s=this.get(e,r);if(s!==void 0)return Sd.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),Sd.trace`cache miss project ${e} key: ${r}`,c}parsedJoinedData(e,t){let r=`parsed-joined-data`,s=this.get(e,r);if(s!==void 0)return Sd.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),Sd.trace`cache miss project ${e} key: ${r}`,c}parsedModel(e,t){let r=`parsed-model`,s=this.get(e,r);if(s!==void 0)return Sd.trace`cache hit project ${e} key: ${r}`,s;let c=t();return this.set(e,r,c),Sd.trace`cache miss project ${e} key: ${r}`,c}computedModel(e,t,r){let s=t?`computed-model-${t.hash}`:`computed-model`,c=this.get(e,s);if(c!==void 0)return Sd.trace`cache hit project ${e} key: ${s}`,c;let u=r();return this.set(e,s,u),Sd.trace`cache miss project ${e} key: ${s}`,u}};const{findNodeForKeyword:Cd,findNodeForProperty:wd}=Jn,{getDocument:Td,streamAllContents:Ed}=Ln,Dd=Y.getChild(`locator`);var LikeC4ModelLocator=class{services;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,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=S(t)?this.projects.ensureProjectId():projectIdFrom(t)),S(t)){let e=t,s=this.fqnIndex.byFqn(r,e).head();if(!s)return null;let c=this.langiumDocuments.getDocument(s.documentUri),u=this.findParsedElementByFqnIn(e,c);return u&&c?{projectId:r,element:u,document:c}:null}let s=this.fqnIndex.getFqn(t),c=Td(t),u=this.findParsedElementByFqnIn(s,c);return u&&c?{projectId:r,element:u,document:c}:null}catch(e){return Dd.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[r,s]=splitGlobalFqn(e);r??=this.projects.ensureProjectId(t);let c=this.fqnIndex.byFqn(r,s).head(),u=c?.nameSegment??c?.selectionSegment;return!c||!u?null:{uri:c.documentUri.toString(),range:u.range}}locateDeploymentElement(e,t){let r=this.projects.ensureProjectId(t),s=e,c=this.deploymentsIndex.byFqn(r,s).head(),u=c?.nameSegment??c?.selectionSegment;return!c||!u?null:{uri:c.documentUri.toString(),range:u.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(s)&&!isDeploymentRelation(s))continue;let c=s.kind?wd(s.$cstNode,`kind`):void 0;if(c??=s.dotKind?wd(s.$cstNode,`dotKind`):void 0,c??=Cd(s.$cstNode,`->`),c??=wd(s.$cstNode,`title`),c??=wd(s.$cstNode,`target`),c??=s.$cstNode,c)return{uri:t.uri.toString(),range:{start:c.range.start,end:c.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(s))return{doc:t,view:r,viewAst:s}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let s=r.viewAst,c=s.name?wd(s.$cstNode,`name`):void 0;return c??=Cd(s.$cstNode,`view`),c??=s.$cstNode,c?{uri:r.doc.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<rn.Linked&&(Dd.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(rn.Linked,r.uri,t));let s=projectIdFrom(r);Dd.trace`locate document tags for ${r.uri.fsPath} in project ${s}`;try{let e=this.services.likec4.LastSeen.specification(s)?.tags,t=this.services.likec4.LastSeen.styles(s)??ea.DEFAULT;if(!e)return Dd.trace(`No specification or styles found for project ${s}, cannot locate tags for document ${r.uri.fsPath}`),null;let c=k(Ed(r.parseResult.value),ifilter(e=>isTag(e)||isTagRef(e)),toArray(),A(r=>{let s,c;try{isTag(r)?(s=r.name,c=r.$cstNode):(s=r.tag.$refText,c=r.tag.$refNode);let u=e[s];return invariant(u,`Tag ${s} not found in merged specification`),invariant(c,`Tag ${s} does not have a $cstNode`),{name:s,color:t.tagColor(u.color).fill,range:c.range,isSpecification:isTag(r)}}catch(e){return Dd.warn(`Fail on tag ${s}`,{err:e}),[]}}));return Dd.debug(`Found ${c.length} tags in document ${r.uri.path}`),c}catch(e){return Dd.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView(r)||!r.body)return Dd.warn(`View ${e.view} is not a dynamic view`),null;let s=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,c=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,s);if(!c||!isStepOrSeries(c))return Dd.warn(`Failed to locate dynamic view step ${s} in view ${e.view}`),null;let u=c.kind?wd(c.$cstNode,`kind`):void 0;return u??=c.dotKind?wd(c.$cstNode,`dotKind`):void 0,u??=Cd(c.$cstNode,`->`),u??=Cd(c.$cstNode,`<-`),u??=wd(c.$cstNode,`title`),u??=wd(c.$cstNode,`target`),u??=c.$cstNode,u?{uri:t.uri.toString(),range:{start:u.range.start,end:u.range.start}}:null}};function stripIndent(e){let t=e.match(/^[ \t]*(?=\S)/gm);if(!t)return e;let r=1/0;for(let e of t)r=Math.min(r,e.length);return r===0||r===1/0?e:e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``)}function dedent(e){return stripIndent(e.replace(/^(?:[ \t]*\r?\n)+|(?:\r?\n[ \t]*)+$/g,``))}const Od=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,s){try{let c=e(t,r,s);g(c)&&await c;return}catch(e){let s=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${s}`,{node:t}),Y.debug(`Validation failed: ${s}`,{error:e})}}}const{getDocument:kd}=Ln,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,s)=>{let c=r.getName(e);if(!c){s(`error`,`DeploymentNode must be named`,{node:e});return}let u=nonNullable(r.getNameNode(e),`name CstNode not found`).range;Od.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:e,range:u});let d=projectIdFrom(e),p=t.getFqn(e);t.byFqn(d,p).limit(2).toArray().length>1&&s(`error`,`Duplicate node name "${p}"`,{node:e,range:u})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,s)=>{let c=r.getName(e);if(!c){s(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let u=nonNullable(r.getNameNode(e),`name CstNode not found`).range;Od.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:e,range:u});let d=projectIdFrom(e),p=t.getFqn(e);t.byFqn(d,p).limit(2).toArray().length>1&&s(`error`,`Duplicate instance name "${p}"`,{node:e,range:u})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let s=kd(e),c=t.forDocument(s),u;try{u=c._resolveDeploymentRelationSource(e)}catch(t){Y.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(G.isImportRef(u)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(G.isModelRef(u)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let d=c.parseFqnRef(e.target);if(G.isImportRef(d)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(G.isModelRef(d)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}isSameHierarchy(u.deployment,d.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;(!r||!isDeploymentNode(r))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),Ad=r(e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let s=elementRef(e.source),c=s&&t.getFqn(s);c||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let u=elementRef(e.target),d=u&&t.getFqn(u);d||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),c&&d&&isSameHierarchy(c,d)&&c!==d&&r(`error`,`Invalid parent-child relationship`,{node:e})})},`stepSingle`),jd=r(e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let s=e.source;isStep(s)&&s.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let c=elementRef(e.target);c&&t.getFqn(c)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},`stepSeries`),subflowStep=e=>{let isParallel=e=>e.kind===`par`||e.kind===`parallel`,isAltBranch=e=>e.kind===`else`||e.kind===`if`||e.kind===`when`;return tryOrLog((e,t)=>{isParallel(e)&&isSubflowStep(e.$container)&&isParallel(e.$container)&&t(`error`,`Nested parallel blocks are not allowed`,{node:e,property:`kind`}),isAltBranch(e)?isAltSteps(e.$container)||t(`error`,`"${e.kind}" alternative branch must be inside "alt"`,{node:e,property:`kind`}):isAltSteps(e.$container)&&t(`error`,`"${e.kind}" can not be used as an alternative branch, only "if", "when" or "else" are allowed`,{node:e,property:`kind`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(E(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}_n(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:Md}=Ln,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator;return tryOrLog((e,s)=>{let c=t.getFqn(e);if(!c){s(`error`,`Not indexed element`,{node:e,property:`name`});return}Od.includes(e.name)&&s(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let u=Md(e),d=u.uri,p=r.getAstNodePath(e),m=t.byFqn(projectIdFrom(u),c).filter(e=>e.documentUri!==d||e.path!==p).head();if(m){let t=m.documentUri!==d;s(`error`,`Duplicate element name ${e.name===c?e.name:e.name+` (`+c+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:m.nameSegment?.range??m.selectionSegment?.range,uri:m.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Nd}=Ln,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let s=projectIdFrom(Nd(e));if(e.project===s){r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(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`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||S(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=ie(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==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((!ie(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!ie(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!ie(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),ie(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),S(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}nonexhaustive(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=t.forDocument(kn(e)),c=safeCall(()=>s._resolveRelationSource(e));if(!c){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let u=safeCall(()=>s.parseFqnRef(e.target));if(!u){r(`error`,`Target not resolved`,{node:e,property:`target`});return}G.isImportRef(c)&&(G.isImportRef(u)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),isSameHierarchy(G.flatten(c),G.flatten(u))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new cn(e.shared,rn.Linked),calcFingerprint=({source:e,target:t,kind:r,title:s})=>stringHash(`extend-relation`,G.flatten(e),G.flatten(t),r??`default`,s??``);function getProjectFingerprints(t){return r.get(t,()=>new Set(k(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),A(e=>e.c4Relations??[]),w(e=>calcFingerprint(e)))))}return tryOrLog((e,r)=>{let s=kn(e),c=t.forDocument(s),u=safeCall(()=>c.parseFqnRef(e.source));if(!u){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let d=safeCall(()=>c.parseFqnRef(e.target));if(!d){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!G.isModelRef(u)&&!G.isImportRef(u)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!G.isModelRef(d)&&!G.isImportRef(d)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let p=projectIdFrom(s),m=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:h=``}=c.parseBaseProps({},{title:e.title}),g=calcFingerprint({source:u,target:d,kind:m,title:h});getProjectFingerprints(p).has(g)||r(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Od.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e),c=t.projectElements(s,nc).filter(t=>t.name===e.name&&t.node!==e).head();if(c){let t=c.documentUri!==kn(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Od.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e),c=t.projectElements(s,Bs).filter(t=>t.name===e.name&&t.node!==e).head();if(c){let t=c.documentUri!==kn(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=e.name,c=projectIdFrom(e),u=t.projectElements(c,`Tag`).filter(t=>t.name===s&&t.node!==e).head();if(u){let t=u.documentUri!==kn(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:u.nameSegment.range,uri:u.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Od.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e);t.projectElements(s,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=projectIdFrom(e),c=t.projectElements(s,Tc),u=t.projectElements(s,wc);c.concat(u).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=projectIdFrom(e);t.projectElements(s,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Pd=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let s=Kn(e.$cstNode,[`BLOCK_COMMENT`]);if(s&&Pd.test(s.text)&&r(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:s.range}),!e.name)return;Od.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let c=projectIdFrom(e);t.projectElements(c,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let s=r.filter(isFqnRefExpr),c=s[0]?.ref?.parent;for(let r=1;r<s.length;r++){let u=s[r];e.value===`same`&&!areSame(c,u?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=getViewRulePredicateContainer(e);if(s?.$type!==`DynamicViewIncludePredicate`&&s?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let c=s.$type===`DynamicViewIncludePredicate`,u=t.forDocument(kn(s)),d=K.unwrap(u.parseFqnExprWith(e).custom.expr);switch(!0){case K.isWildcard(d)&&c:case K.isElementKindExpr(d)&&c:case K.isElementTagExpr(d)&&c:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case K.isWildcard(d):case K.isModelRef(d):case K.isDeploymentRef(d):return;case K.isElementKindExpr(d):case K.isElementTagExpr(d):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:nonexhaustive(d)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=t.forDocument(kn(e)).parseFqnRefExpr(e),c=getViewRulePredicateContainer(e),u=isFqnRefInsideDeployment(e)&&!_n(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(c?.$type===`DeploymentViewRulePredicate`||u){if(!_n(e,isRelationExpr)){if(K.isModelRef(s)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(K.isDeploymentRef(s)&&G.isInsideInstanceRef(s.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}x(e.selector)&&!isDeploymentNode(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(c?.$type===`DynamicViewIncludePredicate`)switch(!0){case K.isElementKindExpr(s):case K.isElementTagExpr(s):case K.isWildcard(s):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)&&N(Wn(e,isElementView)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=Wn(e,isElementView);r&&N(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let s=Wn(e,isDeploymentViewRulePredicate);if(!s||s.isInclude!==!0)return;let c=kn(e),u=t.forDocument(c),d=Ji.unwrap(u.parseRelationExpr(e)),p=`Model reference is allowed in exclude predicate only`;if(Ji.isDirect(d)){(K.isModelRef(d.source)||K.isModelRef(d.target))&&r(`error`,p,{node:e});return}let m;if(m=Ji.isIncoming(d)?d.incoming:Ji.isOutgoing(d)?d.outgoing:d.inout,K.isModelRef(m)){r(`error`,p,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);if(!(!r||r.$type==`DynamicViewIncludePredicate`)&&!r.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends Dn{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};const Fd=isAnyOf(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isStepStatement,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(Fd(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=rn.Validated?e.diagnostics?.filter(e=>e.severity===un.Error)??[]:[],r=new WeakSet;for(let{node:e}of t)if(!(N(e)||r.has(e))&&(r.add(e),!Fd(e))){let t=findInvalidContainer(e);t&&r.add(t)}let isValid=e=>!r.has(e);return{isValid,invalidNodes:r}}function registerValidationChecks(e){Y.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),Step:Ad(e),StepSeries:jd(e),SubflowStep:subflowStep(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e)});let t=e.shared.lsp.Connection;t&&onNextTick(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)Y.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>Y.error(loggable(e)))})})}const Id=Y.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return S(t)?t.split(`
114
114
  `).join(` `):`md`in t?{md:t.md.split(`
115
115
  `).join(` `)}:{txt:t.txt.split(`
116
- `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case E(e):return dedent(e).trim();case isMarkdownOrString(e)&&E(e.markdown):return{md:dedent(e.markdown).trim()};case isMarkdownOrString(e)&&E(e.text):return{txt:dedent(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=cn.relative(r.folderUri,t.uri)}logError(e,t,r){let s=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Bn(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,c=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;s+=`\n\tat ${e} (${this.doc.uri.fsPath}${c})`}else t&&`$refText`in t&&(s+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?_d.getChild(r).debug(s):_d.debug(s)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){return I(t,t=>this.tryParse(e,t,r)??[])}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(nonNullable(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),GlobalFqn(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(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)||j(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return T(t)?[t]:[];{let e=t.md||t.txt;return T(e)?[e]:[]}}else if(isMetadataArray(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(T);return[]},t=N(e.props,I(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),F(([e,t])=>T(t)));if(j(t))return;let r=N(t,se(([e])=>e),g(e=>e.map(([e,t])=>t))),s={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(s[e]=t.length===1?t[0]:t);return j(s)?void 0:s}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>nonNullable(e.tag.ref,`Tag reference is not resolved`).name).filter(T)),t=t.prev;return isNonEmptyArray(r)?le(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,F(e.props,isLinkProperty),e=>{let t=e.value;if(y(t))return;let r=T(e.title)?toSingleLine(e.title):void 0,s=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return exact({url:t,title:r,relative:s&&s!==t?s:void 0})});return isNonEmptyArray(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.ref?.name;if(!r){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&Ir(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&Mr(r):return kr(this.doc.uri.toString(),`../`,r);case r&&Pr(r):return Fr(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,s=t>0?e.substring(t+1):``,c={"@":`./images`,...this.project.config.imageAliases}[r];if(!c){_d.warn(`Image alias "${r}" not found in project configuration`);return}let u=s?Fr(c,s):c;return Fr(this.project.folderUri.toString(),u)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=w(e.alpha)?e.alpha:void 0;return E(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}nonexhaustive(e)}}parseElementStyle(e){if(!e)return{};if(S(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}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 r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):T(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);T(e)&&(t.color=e);break}case isShapeProperty(r):T(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);T(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);T(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):T(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):T(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=v(r.value)?r.value:!1;break;case isShapeSizeProperty(r):T(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):T(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):T(r.value)&&(t.textSize=parseAstSizeValue(r));break;default:nonexhaustive(r)}}catch(e){this.logError(e,r)}return exact(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),s=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return exact({title:r,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:s,technology:toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology))})}};function*streamDeploymentModel(e){let t=$e.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],s;for(;s=t.shift();){if(isDeploymentRelation(s)){r.push(s);continue}if(s.body&&s.body.elements.length>0)for(let e of s.body.elements)t.push(e);yield s}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:nonexhaustive(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),s=nonNullable(e.kind.ref,`DeploymentKind not resolved`).name,c=this.parseTags(e.body)??void 0,u=this.parseLinks(e.body),d=this.parseElementStyle(e.body?.props),p=this.getMetadata(e.body?.props.find(isMetadataProperty)),m=N(e.body?.props??[],F(t),F(isElementStringProperty),h(e=>[e.key,e.value])),{title:g,..._}=this.parseBaseProps(m,{title:e.title,summary:e.summary});return exact({id:r,kind:s,title:g??nameFromFqn(r),..._,tags:c,links:u,style:d,metadata:p})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),s=this.parseFqnRef(e.target.modelElement);invariant(G.isModelRef(s)||G.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(e.body)??void 0,u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=N(e.body?.props??[],F(t),F(isElementStringProperty),h(e=>[e.key,e.value])),m=this.parseBaseProps(p,{title:e.title,summary:e.summary});return exact({id:r,element:s,tags:c,links:this.parseLinks(e.body),...m,style:u,metadata:d})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.parseLinks(e.body);return!t&&j(r??{})&&!s?null:exact({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:r,tags:t,links:s})}_resolveDeploymentRelationSource(e){if(ie(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,r=this.getAstNodePath(e),s=this._resolveDeploymentRelationSource(e);invariant(G.isDeploymentRef(s),`Invalid source for deployment relation`);let c=this.parseFqnRef(e.target);invariant(G.isDeploymentRef(c),`Invalid target for deployment relation`);let u=this.convertTags(e)??this.convertTags(e.body)??void 0,d=this.convertLinks(e.body),p=(e.kind??e.dotKind?.kind)?.ref?.name,m=this.getMetadata(e.body?.props.find(isMetadataProperty)),g=N(e.body?.props??[],F(isRelationStringProperty),F(e=>T(e.value)),h(e=>[e.key,e.value])),_=N(e.body?.props??[],F(isRelationNavigateToProperty),Ie())?.value.view.ref?.name,v=this.parseBaseProps(g,{title:e.title}),y=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(`deployment`,this.docUri,r,s.deployment,c.deployment),source:s,target:c,...v,metadata:m,kind:p,tags:u,links:d,...toRelationshipStyle(y?.props,t),navigateTo:_,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;invariant(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),s=this.getAstNodePath(e),c=e.name;c||=`deployment_`+stringHash(this.doc.uri.toString(),s);let{title:u=null,description:d=null}=this.parseBaseProps(N(r,F(isViewStringProperty),h(e=>[e.key,e.value]))),p=this.convertTags(t),m=this.convertLinks(t);return Vl.writeId(e,c),{[zi]:`deployment`,id:c,astPath:s,title:toSingleLine(u)??null,description:d,tags:p,links:isNonEmptyArray(m)?m:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);nonexhaustive(e)}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;p(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);invariant(t,`Expected tag name`);let s={tag:parseEquals(e,t)};return r?{participant:r,operator:s}:s}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);invariant(t,`Expected kind name`);let s={kind:parseEquals(e,t)};return r?{participant:r,operator:s}:s}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);invariant(t,`Expected metadata key`);let s={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:s}:s}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:nonexhaustive(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[isAndOperator(t)?t.and:t,isAndOperator(r)?r.and:r].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[isOrOperator(t)?t.or:t,isOrOperator(r)?r.or:r].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{or:e}}default:nonexhaustive(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=nonNullable(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(nonNullable(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let s=instanceRef(e);return s?{deployment:this.resolveFqn(s),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};nonexhaustive(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);nonexhaustive(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);nonexhaustive(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return T(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return ie(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return ie(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return ie(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return ie(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return ie(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=T(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return v(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return T(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return T(t.value)&&(e.custom[t.key]=t.value),e;nonexhaustive(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);nonexhaustive(e)}parseFqnExprWhere(e){return invariant(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return invariant(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return invariant(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);nonexhaustive(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=[],r=e;for(;r;){try{p(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);nonexhaustive(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(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e[t.key]=r),e}if(isArrowProperty(t))return T(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return T(r)&&(e[t.key]=r),e}if(isLineProperty(t))return T(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return T(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return v(t.value)&&(e[t.key]=t.value),e;nonexhaustive(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);nonexhaustive(e)}parseRelationExprWhere(e){invariant(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,s=t.where?.condition,c=e.where?parseWhereClause(e.where):null,u;return u=c&&s?createBinaryOperator(`and`,s,c):c??s??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:u}}}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:nonexhaustive(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 GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,s=e.value.globals.filter(r),c=s.flatMap(e=>e.predicates.filter(r));for(let e of c)try{let r=e.name;if(!T(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let u=s.flatMap(e=>e.styles.filter(r));for(let e of u)try{let r=e.id.name;if(!T(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let s=this.parseGlobalStyleOrGroup(e);P(s,1)&&(t.styles[r]=s)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let s=this.parseGlobalPredicateGroup(e);P(s,1)&&(r.predicates[t]=s);return}if(isGlobalDynamicPredicateGroup(e)){let s=this.parseGlobalDynamicPredicateGroup(e);P(s,1)&&(r.dynamicPredicates[t]=s);return}nonexhaustive(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));nonexhaustive(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(nonNullable(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function*streamModel(e){let t=$e.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),r=[],s;for(;s=t.shift();){if(isRelation(s)){r.push(s);continue}if(isExtendRelation(s)){r.push(s);continue}if(s.body?.elements&&P(s.body.elements,1))for(let e of s.body.elements)t.push(e);yield s}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}nonexhaustive(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),s=nonNullable(e.kind.ref,`Element kind is not resolved`).name,c=this.parseTags(e.body),u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),[m,g,_]=e.props??[],v=N(e.body?.props??[],F(t),F(isElementStringProperty),h(e=>[e.key,e.value])),{title:y,...b}=this.parseBaseProps(v,{title:m,summary:g,technology:_});return exact({id:r,kind:s,astPath:p,title:y,metadata:d,tags:c??void 0,links:this.parseLinks(e.body),...b,style:u})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.parseLinks(e.body);if(!t&&y(r)&&!s)return null;let c=this.getAstNodePath(e);return exact({id:this.resolveFqn(e),astPath:c,metadata:r,tags:t,links:s})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);invariant(G.isModelRef(t)||G.isImportRef(t),`Source must be a model reference`),invariant(G.isModelRef(r)||G.isImportRef(r),`Target must be a model reference`);let s=this.parseTags(e.body),c=this.getMetadata(e.body?.props.find(isMetadataProperty)),u=this.getAstNodePath(e),d=this.parseLinks(e.body);if(!s&&j(c??{})&&!d)return null;let p=(e.kind??e.dotKind?.kind)?.ref?.name,{title:m=``}=this.parseBaseProps({},{title:e.title});return exact({id:stringHash(`extend-relation`,G.flatten(t),G.flatten(r),p??`default`,m),astPath:u,metadata:c,tags:s,links:d})}_resolveRelationSource(e){if(ie(e.source)){let t=this.parseFqnRef(e.source);return invariant(G.isModelRef(t)||G.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),s=this.parseFqnRef(e.target);invariant(G.isModelRef(s)||G.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(e)??this.parseTags(e.body)??void 0,u=this.parseLinks(e.body),d=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),m=this.getAstNodePath(e),g=N(e.body?.props??[],F(isRelationStringProperty),F(e=>T(e.value)),h(e=>[e.key,e.value])),_=N(e.body?.props??[],F(isRelationNavigateToProperty),D(e=>e.value.view.ref?.name),F(T),Ie()),{title:v=``,description:y,technology:b}=this.parseBaseProps(g,{title:e.title,description:e.description,technology:e.technology}),x=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(this.docUri,m,G.flatten(r),G.flatten(s)),astPath:m,source:r,target:s,title:v,metadata:p,kind:d,tags:c,links:u,navigateTo:_,description:y,technology:b,...toRelationshipStyle(x?.props,t)})}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);nonexhaustive(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 SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let s of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(s))}catch(e){this.logError(e,s,`specification`)}for(let s of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(s))}catch(e){this.logError(e,s,`specification`)}let s=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:r}of s)try{let s=e.name;if(!T(s))continue;if(s in t.relationships){this.logError(`Relationship kind "${s}" is already defined`,e,`specification`);continue}let c=N(r.filter(isSpecificationRelationshipStringProperty)??[],F(e=>this.isValid(e)&&p(e.value)),h(e=>[e.key,removeIndent(parseMarkdownAsString(e.value))]),We(k)),u=r.filter(isMultipleProperty);u.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${s}", using the first one`,e,`specification`);let d=u[0];t.relationships[s]={...c,...toRelationshipStyle(r.filter(isRelationshipStyleProperty),this.isValid),...d&&{multiple:d.value}}}catch(t){this.logError(t,e,`specification`)}let c=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of c)try{let r=e.tag.name,s=this.getAstNodePath(e.tag),c=e.color&&this.parseColorLiteral(e.color);if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}T(r)&&(t.tags[r]={astPath:s,...c?{color:c}:{}})}catch(t){this.logError(t,e,`specification`)}let u=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of u)try{let s=e.name;if(s in t.colors){this.logError(`Custom color "${s}" is already defined`,e,`specification`);continue}t.colors[s]={color:nonNullable(this.parseColorLiteral(r),`Color "${s}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,s=t.name;if(!T(s))throw Error(`DeploymentNodeKind name is not resolved`);let c=this.parseTags(e),u=this.parseElementStyle(r.find(isElementStyleProperty)),d=this.parseLinks(e),p=N(r.filter(isSpecificationElementStringProperty)??[],F(e=>this.isValid(e)),h(e=>[e.key,e.value])),m=this.parseBaseProps(p),g=removeIndent(parseMarkdownAsString(p.notation));return{[s]:exact({...m,notation:g,tags:c??void 0,...d&&isNonEmptyArray(d)&&{links:d},style:u})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),s=t.folder&&!j(t.folder.trim())?toSingleLine(t.folder):null;for(let c of t.views)try{if(!e(c))continue;switch(!0){case isElementView(c):this.doc.c4Views.push(this.parseElementView(c,r));break;case isDynamicView(c):this.doc.c4Views.push(this.parseDynamicElementView(c,r));break;case isDeploymentView(c):this.doc.c4Views.push(this.parseDeploymentView(c));break;default:nonexhaustive(c)}if(s){let e=this.doc.c4Views.at(-1);e.title=s+` / `+(e.title||e.id)}}catch(e){this.logError(e,c,`views`)}}}parseElementView(e,t){let r=e.body;invariant(r,`ElementView body is not defined`);let s=this.getAstNodePath(e),c=null;if(`viewOf`in e){let t=elementRef(e.viewOf),r=t&&safeCall(()=>this.resolveFqn(t));if(r)c=r;else{let t=e.name??`unnamed`,r=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,e.viewOf)}}let u=e.name;u||=`view_`+stringHash(this.doc.uri.toString(),s,c??``);let{title:d=null,description:p=null}=this.parseBaseProps(N(r.props,F(e=>this.isValid(e)),F(isViewStringProperty),h(e=>[e.key,e.value]))),m=this.convertTags(r),g=this.convertLinks(r),_={[zi]:`element`,id:u,astPath:s,title:toSingleLine(d)??null,description:p,tags:m,links:isNonEmptyArray(g)?g:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...c&&{viewOf:c}};if(Vl.writeId(e,_.id),`extends`in e){let t=e.extends.view.ref;return invariant(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(_,{extends:t.name})}return _}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);nonexhaustive(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:s}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!s)break;r=s}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);nonexhaustive(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}nonexhaustive(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Gi.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Gi.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),s=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...s&&{notation:s}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;invariant(r,`DynamicElementView body is not defined`);let s=this.isValid,c=r.props.filter(s),u=this.getAstNodePath(e),d=e.name;d||=`dynamic_`+stringHash(this.doc.uri.toString(),u);let{title:p=null,description:m=null}=this.parseBaseProps(N(c,F(isViewStringProperty),h(e=>[e.key,e.value]))),g=this.convertTags(r),_=this.convertLinks(r);Vl.writeId(e,d);let v=ue(c,isDynamicViewDisplayVariantProperty)?.value;return{[zi]:`dynamic`,id:d,astPath:u,title:toSingleLine(p)??null,description:m,tags:g,links:isNonEmptyArray(_)?_:null,variant:v,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,r.steps,e=>isDynamicViewParallelSteps(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);nonexhaustive(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseDynamicParallelSteps(e){let t=pathInsideDynamicView(e),r=e.steps.filter(e=>!isDynamicViewParallelSteps(e)),s=this.tryMap(`views`,r,e=>this.parseDynamicStep(e));return invariant(isNonEmptyArray(s),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:s}}parseDynamicStep(e){if(isDynamicStepSingle(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return invariant(isNonEmptyArray(t),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(isDynamicStepSingle(e.source)){if(!this.isValid(e.source))return[];let r=this.parseDynamicStepSingle(e.source);if(r.isBackward)return[];let s={...this.parseAbstractDynamicStep(e),source:r.target};return s.target===r.source?s.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([s.source,s.target])),[r,s]}t??=[];let r=this.recursiveParseDynamicStepChain(e.source,t);if(!isNonEmptyArray(r)||!this.isValid(e))return[];let s=Te(r),c={...this.parseAbstractDynamicStep(e),source:s.target},u=t.findIndex(([e,t])=>e===c.target&&t===c.source);return u===-1?t.push([c.source,c.target]):(c.isBackward=!0,t.splice(u,t.length-u)),[...r,c]}parseDynamicStepSingle(e){let t=elementRef(e.source);if(!t)throw Error(`Invalid reference to source`);let r={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(r={...r,source:r.target,target:r.source,isBackward:!0}),r}parseAbstractDynamicStep(e){let t=elementRef(e.target);if(!t)throw Error(`Invalid reference to target`);let r={target:this.resolveFqn(t),astPath:pathInsideDynamicView(e)},s=removeIndent(e.title);s&&(r.title=s);let c=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;c&&(r.kind=c);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;T(e)&&(r.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(ie(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(r.description=e)}else r[t.key]=removeIndent(parseMarkdownAsString(t.value))??``;break;case isNotesProperty(t):ie(t.value)&&(r[t.key]=removeIndent(t.value));break;case isArrowProperty(t):ie(t.value)&&(r[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);ie(e)&&(r[t.key]=e);break}case isLineProperty(t):ie(t.value)&&(r[t.key]=t.value);break;case isMultipleProperty(t):break;default:nonexhaustive(t)}}catch(e){this.logError(e,t,`views`)}return r}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)w(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}$n();const vd=N(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends vd{};const yd=Y.getChild(`parser`),isError=e=>e.severity===Zn.Error;var LikeC4ModelParser=class extends ADisposable{services;cachedParsers=new Ze.default(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(_n.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(Kt.Linked,async e=>{this.cachedParsers.has(e)&&(yd.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:cn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(Kt.Linked,async t=>{for(let r of t)if(!e.shared.workspace.ProjectsManager.isExcluded(r))try{this.parse(r)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(Kt.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(yd.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:cn.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){invariant(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=cn.relative(t.folderUri,e.uri);e.likec4ProjectId?yd.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:r}):yd.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<Kt.Linked&&yd.debug(`Document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let s={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new Ye.default(Set)};e=Object.assign(e,s);let c=new DocumentParser(this.services,e,t);try{c.parseSpecification(),c.parseImports(),c.parseModel(),c.parseDeployment(),c.parseGlobals(),c.parseViews()}catch(e){throw Error(`Error parsing document ${r}`,{cause:e})}return c}},LikeC4ValueConverter=class extends ir{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ht.convertString(t)):super.runConverter(e,t,r)}};$n();const{findNodeForKeyword:bd}=Un,asViewStyleRule=(e,t,r=0)=>{let s=r>0?` `.repeat(r):``;return[s+`style ${e} {`,...Re(t).map(([e,t])=>s+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),s+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let s=r.targets.value;if(!s||T(r.targets.prev)||s.$type!==`FqnRefExpr`||T(s.selector))return!1;let c=s.ref?.value?.ref;return(c?t.resolve(c):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:s,style:c}){invariant(r.body,`View ${t.id} has no body`);let u=r.$cstNode;invariant(u,`viewCstNode`);let d=Te(r.body.rules)?.$cstNode?.range.end??r.body.$cstNode?.range.end;invariant(d,`insertPos is not defined`);let p=u.range.start.character+2,m=e.likec4.FqnIndex,h=F(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),g=t._type===`element`?t.viewOf??null:null,_=[],v=[];s.forEach(e=>{let t=Ce(h,isMatchingViewRule(e,m)),r=g&&isAncestor(g,e)?e.substring(g.length+1):e;t?_.push({fqn:r,rule:t}):v.push({fqn:r})});let y={start:d,end:d},includeRange=e=>{e.start.line<=y.start.line&&(e.start.line==y.start.line?y.start.character=Math.min(e.start.character,y.start.character):y.start=e.start),e.end.line>=y.end.line&&(e.end.line==y.end.line?y.end.character=Math.max(e.end.character,y.end.character):y.end=e.end)},b=[];if(v.length>0){let e=v.flatMap(({fqn:e})=>asViewStyleRule(e,c,p));b.push(mn.insert(d,`
116
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case S(e):return dedent(e).trim();case isMarkdownOrString(e)&&S(e.markdown):return{md:dedent(e.markdown).trim()};case isMarkdownOrString(e)&&S(e.text):return{txt:dedent(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=pn.relative(r.folderUri,t.uri)}logError(e,t,r){let s=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Fn(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,c=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;s+=`\n\tat ${e} (${this.doc.uri.fsPath}${c})`}else t&&`$refText`in t&&(s+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?Id.getChild(r).debug(s):Id.debug(s)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){let s=0;return A(t,t=>{try{if(!t||!this.isValid(t))return[];let e=r(t,s);return e===void 0?[]:(s++,e)}catch(r){return this.logError(r,t,e),[]}})}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(nonNullable(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),GlobalFqn(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(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)||E(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return x(t)?[t]:[];{let e=t.md||t.txt;return x(e)?[e]:[]}}else if(isMetadataArray(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(x);return[]},t=k(e.props,A(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),M(([e,t])=>x(t)));if(E(t))return;let r=k(t,re(([e])=>e),h(e=>e.map(([e,t])=>t))),s={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(s[e]=t.length===1?t[0]:t);return E(s)?void 0:s}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>nonNullable(e.tag.ref,`Tag reference is not resolved`).name).filter(x)),t=t.prev;return isNonEmptyArray(r)?pe(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,M(e.props,isLinkProperty),e=>{let t=e.value;if(se(t))return;let r=x(e.title)?toSingleLine(e.title):void 0,s=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return exact({url:t,title:r,relative:s&&s!==t?s:void 0})});return isNonEmptyArray(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.ref?.name;if(!r){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&Er(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&Sr(r):return yr(this.doc.uri.toString(),`../`,r);case r&&wr(r):return Tr(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,s=t>0?e.substring(t+1):``,c={"@":`./images`,...this.project.config.imageAliases}[r];if(!c){Id.warn(`Image alias "${r}" not found in project configuration`);return}let u=s?Tr(c,s):c;return Tr(this.project.folderUri.toString(),u)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=ie(e.alpha)?e.alpha:void 0;return S(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}nonexhaustive(e)}}parseElementStyle(e){if(!e)return{};if(ze(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}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 r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):x(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);x(e)&&(t.color=e);break}case isShapeProperty(r):x(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);x(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);x(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):x(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):x(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=ee(r.value)?r.value:!1;break;case isShapeSizeProperty(r):x(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):x(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):x(r.value)&&(t.textSize=parseAstSizeValue(r));break;default:nonexhaustive(r)}}catch(e){this.logError(e,r)}return exact(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),s=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return exact({title:r,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:s,technology:toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology))})}};function*streamDeploymentModel(e){let t=ot.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],s;for(;s=t.shift();){if(isDeploymentRelation(s)){r.push(s);continue}if(s.body&&s.body.elements.length>0)for(let e of s.body.elements)t.push(e);yield s}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:nonexhaustive(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),s=nonNullable(e.kind.ref,`DeploymentKind not resolved`).name,c=this.parseTags(e.body)??void 0,u=this.parseLinks(e.body),d=this.parseElementStyle(e.body?.props),p=this.getMetadata(e.body?.props.find(isMetadataProperty)),h=k(e.body?.props??[],M(t),M(isElementStringProperty),m(e=>[e.key,e.value])),{title:g,..._}=this.parseBaseProps(h,{title:e.title,summary:e.summary});return exact({id:r,kind:s,title:g??nameFromFqn(r),..._,tags:c,links:u,style:d,metadata:p})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),s=this.parseFqnRef(e.target.modelElement);invariant(G.isModelRef(s)||G.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(e.body)??void 0,u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=k(e.body?.props??[],M(t),M(isElementStringProperty),m(e=>[e.key,e.value])),h=this.parseBaseProps(p,{title:e.title,summary:e.summary});return exact({id:r,element:s,tags:c,links:this.parseLinks(e.body),...h,style:u,metadata:d})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.parseLinks(e.body);return!t&&E(r??{})&&!s?null:exact({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:r,tags:t,links:s})}_resolveDeploymentRelationSource(e){if(_(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,r=this.getAstNodePath(e),s=this._resolveDeploymentRelationSource(e);invariant(G.isDeploymentRef(s),`Invalid source for deployment relation`);let c=this.parseFqnRef(e.target);invariant(G.isDeploymentRef(c),`Invalid target for deployment relation`);let u=this.convertTags(e)??this.convertTags(e.body)??void 0,d=this.convertLinks(e.body),p=(e.kind??e.dotKind?.kind)?.ref?.name,h=this.getMetadata(e.body?.props.find(isMetadataProperty)),g=k(e.body?.props??[],M(isRelationStringProperty),M(e=>x(e.value)),m(e=>[e.key,e.value])),_=k(e.body?.props??[],M(isRelationNavigateToProperty),Ue())?.value.view.ref?.name,v=this.parseBaseProps(g,{title:e.title}),y=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(`deployment`,this.docUri,r,s.deployment,c.deployment),source:s,target:c,...v,metadata:h,kind:p,tags:u,links:d,...toRelationshipStyle(y?.props,t),navigateTo:_,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;invariant(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),s=this.getAstNodePath(e),c=e.name;c||=`deployment_`+stringHash(this.doc.uri.toString(),s);let{title:u=null,description:d=null}=this.parseBaseProps(k(r,M(isViewStringProperty),m(e=>[e.key,e.value]))),p=this.convertTags(t),h=this.convertLinks(t);return lu.writeId(e,c),{[Gi]:`deployment`,id:c,astPath:s,title:toSingleLine(u)??null,description:d,tags:p,links:isNonEmptyArray(h)?h:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);nonexhaustive(e)}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;ce(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);invariant(t,`Expected tag name`);let s={tag:parseEquals(e,t)};return r?{participant:r,operator:s}:s}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);invariant(t,`Expected kind name`);let s={kind:parseEquals(e,t)};return r?{participant:r,operator:s}:s}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);invariant(t,`Expected metadata key`);let s={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:s}:s}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:nonexhaustive(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[isAndOperator(t)?t.and:t,isAndOperator(r)?r.and:r].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[isOrOperator(t)?t.or:t,isOrOperator(r)?r.or:r].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{or:e}}default:nonexhaustive(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=nonNullable(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(nonNullable(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let s=instanceRef(e);return s?{deployment:this.resolveFqn(s),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};nonexhaustive(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);nonexhaustive(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);nonexhaustive(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return x(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return _(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return _(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return _(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return _(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return _(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=x(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return ee(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return x(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return x(t.value)&&(e.custom[t.key]=t.value),e;nonexhaustive(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);nonexhaustive(e)}parseFqnExprWhere(e){return invariant(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return invariant(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return invariant(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.ref.name,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);nonexhaustive(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=[],r=e;for(;r;){try{ce(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);nonexhaustive(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(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e[t.key]=r),e}if(isArrowProperty(t))return x(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return x(r)&&(e[t.key]=r),e}if(isLineProperty(t))return x(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return x(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return ee(t.value)&&(e[t.key]=t.value),e;nonexhaustive(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);nonexhaustive(e)}parseRelationExprWhere(e){invariant(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,s=t.where?.condition,c=e.where?parseWhereClause(e.where):null,u;return u=c&&s?createBinaryOperator(`and`,s,c):c??s??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:u}}}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:nonexhaustive(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 GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,s=e.value.globals.filter(r),c=s.flatMap(e=>e.predicates.filter(r));for(let e of c)try{let r=e.name;if(!x(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let u=s.flatMap(e=>e.styles.filter(r));for(let e of u)try{let r=e.id.name;if(!x(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let s=this.parseGlobalStyleOrGroup(e);j(s,1)&&(t.styles[r]=s)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let s=this.parseGlobalPredicateGroup(e);j(s,1)&&(r.predicates[t]=s);return}if(isGlobalDynamicPredicateGroup(e)){let s=this.parseGlobalDynamicPredicateGroup(e);j(s,1)&&(r.dynamicPredicates[t]=s);return}nonexhaustive(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));nonexhaustive(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(nonNullable(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function*streamModel(e){let t=ot.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),r=[],s;for(;s=t.shift();){if(isRelation(s)){r.push(s);continue}if(isExtendRelation(s)){r.push(s);continue}if(s.body?.elements&&j(s.body.elements,1))for(let e of s.body.elements)t.push(e);yield s}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}nonexhaustive(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),s=nonNullable(e.kind.ref,`Element kind is not resolved`).name,c=this.parseTags(e.body),u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),[h,g,_]=e.props??[],v=k(e.body?.props??[],M(t),M(isElementStringProperty),m(e=>[e.key,e.value])),{title:y,...b}=this.parseBaseProps(v,{title:h,summary:g,technology:_});return exact({id:r,kind:s,astPath:p,title:y,metadata:d,tags:c??void 0,links:this.parseLinks(e.body),...b,style:u})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.parseLinks(e.body);if(!t&&se(r)&&!s)return null;let c=this.getAstNodePath(e);return exact({id:this.resolveFqn(e),astPath:c,metadata:r,tags:t,links:s})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);invariant(G.isModelRef(t)||G.isImportRef(t),`Source must be a model reference`),invariant(G.isModelRef(r)||G.isImportRef(r),`Target must be a model reference`);let s=this.parseTags(e.body),c=this.getMetadata(e.body?.props.find(isMetadataProperty)),u=this.getAstNodePath(e),d=this.parseLinks(e.body);if(!s&&E(c??{})&&!d)return null;let p=(e.kind??e.dotKind?.kind)?.ref?.name,{title:m=``}=this.parseBaseProps({},{title:e.title});return exact({id:stringHash(`extend-relation`,G.flatten(t),G.flatten(r),p??`default`,m),astPath:u,metadata:c,tags:s,links:d})}_resolveRelationSource(e){if(_(e.source)){let t=this.parseFqnRef(e.source);return invariant(G.isModelRef(t)||G.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),s=this.parseFqnRef(e.target);invariant(G.isModelRef(s)||G.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(e)??this.parseTags(e.body)??void 0,u=this.parseLinks(e.body),d=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),h=this.getAstNodePath(e),g=k(e.body?.props??[],M(isRelationStringProperty),M(e=>x(e.value)),m(e=>[e.key,e.value])),_=k(e.body?.props??[],M(isRelationNavigateToProperty),w(e=>e.value.view.ref?.name),M(x),Ue()),{title:v=``,description:y,technology:b}=this.parseBaseProps(g,{title:e.title,description:e.description,technology:e.technology}),ee=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(this.docUri,h,G.flatten(r),G.flatten(s)),astPath:h,source:r,target:s,title:v,metadata:p,kind:d,tags:c,links:u,navigateTo:_,description:y,technology:b,...toRelationshipStyle(ee?.props,t)})}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);nonexhaustive(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 SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let s of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(s))}catch(e){this.logError(e,s,`specification`)}for(let s of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(s))}catch(e){this.logError(e,s,`specification`)}let s=e.flatMap(e=>e.relationships.filter(this.isValid));for(let e of s){let{kind:r,props:s}=e;try{let c=r.name;if(!x(c))continue;if(c in t.relationships){this.logError(`Relationship kind "${c}" is already defined`,r,`specification`);continue}let u=this.parseTags(e),d=this.parseLinks(e),p=k(s.filter(isSpecificationRelationshipStringProperty)??[],M(e=>this.isValid(e)),m(e=>[e.key,e.value])),{summary:h,...g}=this.parseBaseProps(p),_=removeIndent(parseMarkdownAsString(p.notation)),v=s.filter(isMultipleProperty);v.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${c}", using the first one`,r,`specification`);let y=v[0];t.relationships[c]=exact({...g,notation:_,tags:u??void 0,...d&&isNonEmptyArray(d)&&{links:d},...toRelationshipStyle(s.filter(isRelationshipStyleProperty),this.isValid),...y&&{multiple:y.value}})}catch(e){this.logError(e,r,`specification`)}}let c=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of c)try{let r=e.tag.name,s=this.getAstNodePath(e.tag),c=e.color&&this.parseColorLiteral(e.color);if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}x(r)&&(t.tags[r]={astPath:s,...c?{color:c}:{}})}catch(t){this.logError(t,e,`specification`)}let u=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of u)try{let s=e.name;if(s in t.colors){this.logError(`Custom color "${s}" is already defined`,e,`specification`);continue}t.colors[s]={color:nonNullable(this.parseColorLiteral(r),`Color "${s}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,s=t.name;if(!x(s))throw Error(`DeploymentNodeKind name is not resolved`);let c=this.parseTags(e),u=this.parseElementStyle(r.find(isElementStyleProperty)),d=this.parseLinks(e),p=k(r.filter(isSpecificationElementStringProperty)??[],M(e=>this.isValid(e)),m(e=>[e.key,e.value])),h=this.parseBaseProps(p),g=removeIndent(parseMarkdownAsString(p.notation));return{[s]:exact({...h,notation:g,tags:c??void 0,...d&&isNonEmptyArray(d)&&{links:d},style:u})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),s=t.folder&&!E(t.folder.trim())?toSingleLine(t.folder):null;for(let c of t.views)try{if(!e(c))continue;switch(!0){case isElementView(c):this.doc.c4Views.push(this.parseElementView(c,r));break;case isDynamicView(c):this.doc.c4Views.push(this.parseDynamicElementView(c,r));break;case isDeploymentView(c):this.doc.c4Views.push(this.parseDeploymentView(c));break;default:nonexhaustive(c)}if(s){let e=this.doc.c4Views.at(-1);e.title=s+` / `+(e.title||e.id)}}catch(e){this.logError(e,c,`views`)}}}parseElementView(e,t){let r=e.body;invariant(r,`ElementView body is not defined`);let s=this.getAstNodePath(e),c=null;if(`viewOf`in e){let t=elementRef(e.viewOf),r=t&&safeCall(()=>this.resolveFqn(t));if(r)c=r;else{let t=e.name??`unnamed`,r=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,e.viewOf)}}let u=e.name;u||=`view_`+stringHash(this.doc.uri.toString(),s,c??``);let{title:d=null,description:p=null}=this.parseBaseProps(k(r.props,M(e=>this.isValid(e)),M(isViewStringProperty),m(e=>[e.key,e.value]))),h=this.convertTags(r),g=this.convertLinks(r),_={[Gi]:`element`,id:u,astPath:s,title:toSingleLine(d)??null,description:p,tags:h,links:isNonEmptyArray(g)?g:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...c&&{viewOf:c}};if(lu.writeId(e,_.id),`extends`in e){let t=e.extends.view.ref;return invariant(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(_,{extends:t.name})}return _}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);nonexhaustive(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:s}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!s)break;r=s}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);nonexhaustive(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}nonexhaustive(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Zi.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Zi.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),s=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...s&&{notation:s}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;invariant(r,`DynamicElementView body is not defined`);let s=this.isValid,c=r.props.filter(s),u=this.getAstNodePath(e),d=e.name;d||=`dynamic_`+stringHash(this.doc.uri.toString(),u);let{title:p=null,description:h=null}=this.parseBaseProps(k(c,M(isViewStringProperty),m(e=>[e.key,e.value]))),g=this.convertTags(r),_=this.convertLinks(r);lu.writeId(e,d);let v=je(c,isDynamicViewDisplayVariantProperty)?.value;return{[Gi]:`dynamic`,id:d,astPath:u,title:toSingleLine(p)??null,description:h,tags:g,links:isNonEmptyArray(_)?_:null,variant:v,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.parseSteps(r.steps)}}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);nonexhaustive(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseSteps(e){return this.tryMap(`views`,e,e=>this.parseStepStatement(e))}parseStepStatement(e){switch(!0){case isSubflowStep(e):return this.parseSubflowStep(e);case isTryStep(e):return this.parseTryStep(e);case isAltSteps(e):return this.parseAltSteps(e);case isStepSeries(e):return this.parseStepSeries(e);case isStep(e):return this.parseStep(e);default:nonexhaustive(e)}}parseStepSeries(e){let t=this.recursiveParseStepSeries(e);return invariant(isNonEmptyArray(t),`Dynamic step chain must have at least one step`),{[Gi]:`series`,steps:t}}recursiveParseStepSeries(e,t){if(isStep(e.source)){if(!this.isValid(e.source))return[];let r=this.parseStep(e.source);if(r.isBackward)return[];let s={...this.parseAbstractDynamicStep(e),source:r.target};return s.target===r.source?s.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([s.source,s.target])),[r,s]}t??=[];let r=this.recursiveParseStepSeries(e.source,t);if(!isNonEmptyArray(r)||!this.isValid(e))return[];let s=ke(r),c={...this.parseAbstractDynamicStep(e),source:s.target},u=t.findIndex(([e,t])=>e===c.target&&t===c.source);return u===-1?t.push([c.source,c.target]):(c.isBackward=!0,t.splice(u,t.length-u)),[...r,c]}parseStep(e){let t=elementRef(e.source);if(!t)throw Error(`Invalid reference to source`);let r={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(r={...r,source:r.target,target:r.source,isBackward:!0}),r}parseAbstractDynamicStep(e){let t=elementRef(e.target);if(!t)throw Error(`Invalid reference to target`);let r=pathInsideDynamicView(e),s={target:this.resolveFqn(t),astPath:r},c=removeIndent(e.title);c&&(s.title=c);let u=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;u&&(s.kind=u);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;x(e)&&(s.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(_(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(s.description=e)}else s[t.key]=removeIndent(parseMarkdownAsString(t.value))??``;break;case isNotesProperty(t):_(t.value)&&(s[t.key]=removeIndent(t.value));break;case isArrowProperty(t):_(t.value)&&(s[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);_(e)&&(s[t.key]=e);break}case isLineProperty(t):_(t.value)&&(s[t.key]=t.value);break;case isMultipleProperty(t):break;default:nonexhaustive(t)}}catch(e){this.logError(e,t,`views`)}return s}parseSubflowStep(e){let t=e.kind===`parallel`?`par`:e.kind;switch(t){case`break`:case`loop`:case`opt`:case`par`:{let r=this.parseSteps(e.steps);return invariant(isNonEmptyArray(r),`Parallel steps must have at least one step`),exact({[Gi]:t,title:e.title,steps:r})}case`else`:case`if`:case`when`:throw Error(`Unsupported kind: ${t}`);default:nonexhaustive(t)}}parseTryStep(e){if(invariant(this.isValid(e)),isFinallyBlock(e)){let t=this.parseTryStep(e.tryCatch),r=this.parseSteps(e.finally.steps);return isNonEmptyArray(r)?{...t,finally:exact({title:e.title,steps:r})}:t}if(isCatchBlock(e)){let t=this.parseTryStep(e.try),r=this.parseSteps(e.catch.steps);return isNonEmptyArray(r)?{...t,catch:exact({title:e.title,steps:r})}:t}let t=this.parseSteps(e.steps);return invariant(isNonEmptyArray(t),`Try steps must have at least one step`),{[Gi]:`try`,try:exact({title:e.title,steps:t})}}parseAltSteps(e){let t=this.tryMap(`views`,e.branches,e=>{let t=e.kind;invariant(t===`if`||t===`else`||t===`when`,`Expected "if", "else", or "when", got "${t}"`);let r=this.parseSteps(e.steps);return invariant(isNonEmptyArray(r),`Branch steps must have at least one step`),exact({[Gi]:t,title:e.title,steps:r})});return invariant(isNonEmptyArray(t),`Alt must have at least one branch`),exact({[Gi]:`alt`,title:e.title,branches:t})}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)ie(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}const Ld=k(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends Ld{};const Rd=Y.getChild(`parser`),isError=e=>e.severity===un.Error;var LikeC4ModelParser=class extends ADisposable{services;cachedParsers=new it.default(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(er.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(rn.Linked,async e=>{this.cachedParsers.has(e)&&(Rd.trace(`project {project}, Linked: clear cached parser {doc}`,{projectId:e.likec4ProjectId,doc:pn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(rn.Linked,async e=>{for(let t of e)if(isLikeC4UserDocument(t))try{this.parse(t)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(rn.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(Rd.trace(`project {project}, Validated: clear cached parser {doc} because of errors`,{project:e.likec4ProjectId,doc:pn.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){invariant(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=pn.relative(t.folderUri,e.uri);Rd.trace(`project {project}, create parser {doc}`,{project:t.id,doc:r}),e.state<rn.Linked&&Rd.debug(`Document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let s={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new nt.default(Set)};e=Object.assign(e,s);let c=new DocumentParser(this.services,e,t);try{c.parseSpecification(),c.parseImports(),c.parseModel(),c.parseDeployment(),c.parseGlobals(),c.parseViews()}catch(e){throw Error(`Error parsing document ${r}`,{cause:e})}return c}},LikeC4ValueConverter=class extends on{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),tr.convertString(t)):super.runConverter(e,t,r)}};const{findNodeForKeyword:zd}=Jn,asViewStyleRule=(e,t,r=0)=>{let s=r>0?` `.repeat(r):``;return[s+`style ${e} {`,...be(t).map(([e,t])=>s+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),s+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let s=r.targets.value;if(!s||x(r.targets.prev)||s.$type!==`FqnRefExpr`||x(s.selector))return!1;let c=s.ref?.value?.ref;return(c?t.resolve(c):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:s,style:c}){invariant(r.body,`View ${t.id} has no body`);let u=r.$cstNode;invariant(u,`viewCstNode`);let d=ke(r.body.rules)?.$cstNode?.range.end??r.body.$cstNode?.range.end;invariant(d,`insertPos is not defined`);let p=u.range.start.character+2,m=e.likec4.FqnIndex,h=M(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),g=t._type===`element`?t.viewOf??null:null,_=[],v=[];s.forEach(e=>{let t=ve(h,isMatchingViewRule(e,m)),r=g&&isAncestor(g,e)?e.substring(g.length+1):e;t?_.push({fqn:r,rule:t}):v.push({fqn:r})});let y={start:d,end:d},includeRange=e=>{e.start.line<=y.start.line&&(e.start.line==y.start.line?y.start.character=Math.min(e.start.character,y.start.character):y.start=e.start),e.end.line>=y.end.line&&(e.end.line==y.end.line?y.end.character=Math.max(e.end.character,y.end.character):y.end=e.end)},b=[];if(v.length>0){let e=v.flatMap(({fqn:e})=>asViewStyleRule(e,c,p));b.push(Zt.insert(d,`
117
117
  `+e.join(`
118
- `))),y.start={line:d.line+1,character:p},y.end={line:d.line+e.length,character:Te(e)?.length??0}}if(_.length>0)for(let{rule:e}of _){let t=e.$cstNode;invariant(t,`RuleCstNode not found`);for(let[r,s]of Re(c)){let c=r===`opacity`?s.toString()+`%`:s,u=e.props.find(e=>e.key===r);if(u&&u.$cstNode){let{range:{start:e,end:t}}=u.$cstNode;includeRange({start:e,end:t}),b.push(mn.replace({start:e,end:t},r+` `+c));continue}let d=bd(t,`{`)?.range.end;invariant(d,`Opening brace not found`);let p=` `.repeat(t.range.start.character)+` `,m=p+r+` `+c;b.push(mn.insert(d,`
119
- `+m)),includeRange({start:{line:d.line+1,character:p.length},end:{line:d.line+1,character:m.length}})}}return{modifiedRange:y,edits:b}}$n();const{findNodeForKeyword:xd}=Un;function changeViewLayout(e,{view:t,viewAst:r,layout:s}){invariant(r.body,`View ${t.id} has no body`);let c=r.$cstNode;invariant(c,`viewCstNode`);let u=toAstViewLayoutDirection(s.direction),d=Ce(r.body.rules,isViewRuleAutoLayout),p=`autoLayout ${u}`;if(w(s.rankSep)&&(p+=` ${s.rankSep}`,w(s.nodeSep)&&(p+=` ${s.nodeSep}`)),d&&d.$cstNode)return mn.replace(d.$cstNode.range,p);let m=xd(r.body.$cstNode,`}`)?.range.start;invariant(m,`Closing brace not found`);let h=`\t${p}\n\t`;return mn.insert(m,h)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof Ln?e.contents.some(e=>hasContent(e)):!1}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof kn?!e.ifNotEmpty:e instanceof Ln?e.contents.some(e=>hasContentOrNewLine(e)):!1}function fresh(e){return{ctx:e??void 0,out:new Ln}}function materialize(e,t=2){return hn(re(e)?executeOnFresh(void 0,[e]).out:e.out,t).replaceAll(/\r\n/g,`
120
- `)}function executeOnCtx(e,t,...r){S(t)?(invariant(r.length===0,`When first argument is an array, no additional operations are allowed`),r=t):r=[t,...r];for(let t of r)e=t(e);return e}function executeOnFresh(e,t,...r){return S(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...r])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let r=typeof e==`function`?e:t,wrapped=e=>{let t=r(e);return t instanceof Ln?{...e,out:t}:e};return typeof e==`string`&&r.name==``&&Object.defineProperties(wrapped,{name:{value:`wrapped(${e})`}}),wrapped}function isPrintable(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function print(e){return operation(function printOp({ctx:t,out:r}){let s=typeof e==`function`?e(t):e??t;k(s)||s===``||(invariant(isPrintable(s),`Value must be a string, number or boolean - got `+typeof s),r.append(String(s)))})}function noop(){return x()}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:r}){let s=executeOnFresh(t,e);r.appendIf(hasContent(s.out),s.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=dedent(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[Jn(t.split(/\r?\n/),{separator:Wn})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:r}){let s=executeOnFresh(e,t);hasContent(s.out)&&r.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:s.out.contents}).appendNewLineIfNotEmpty()})}function inlineText(e){return operation(({ctx:t,out:r})=>{let s=e??t;if(k(s))return;invariant(E(s),`Value must be a string - got `+typeof s);let c=s.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();r.append(`'${c}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:r}){let s=typeof e==`function`?e(t):e??t;if(!k(s))return invariant(E(s),`Value must be a string - got `+typeof s),s.includes(`
121
- `)?multilineText(s)({ctx:s,out:r}):inlineText()({ctx:s,out:r})})}const Sd=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let r=e??t.ctx;if(!k(r))return invariant(E(r),`Value must be a string - got `+typeof r),multilineText(r,Sd)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let r=e??t.ctx;if(!k(r)){if(typeof r==`string`)return text(r)(t);if(`md`in r)return markdown(r.md)(t);if(`txt`in r)return multilineText(r.txt)(t);throw Error(`Invalid MarkdownOrString value: `+r)}})}t(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:r}){let{operations:s,...c}=e,u=Array.isArray(s)?s:[s];invariant(P(u,1),`At least one operation is required`);let d;return d=u.length===1?u[0](fresh(t)).out.contents:N(eachOnFresh(t,u),D(e=>e.out)),d=F(d,hasContentOrNewLine),r.appendIf(d.length>0,Jn(d,c))})}t(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,r)=>!r&&hasContent(e)?` `:void 0})}function lines(...e){let t=A(e);if(w(t)){let e=fresh(void 0);for(let r=0;r<t;r++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,r,s)=>s?void 0:e.out})}return join$1({operations:e,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0})}function withctx(...e){let t=e[0];if(e.length===1)return(...e)=>operation(function withctx1({out:r}){executeOnCtx({ctx:t,out:r},e)});let r=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},r)})}function property(e,t){return operation(function propertyOp({ctx:r,out:s}){let c=b(r)&&hasProp(r,e)?r[e]:void 0;if(c!=null){if(!t){invariant(isPrintable(c),`Property ${e} is not printable "${c}"`),s.append(e,` `,String(c));return}t({ctx:c,out:s})}})}function execToOut(e){return(t,...r)=>executeOnCtx({ctx:t,out:e},r)}function zodOp(e){return t=>()=>({ctx:r,out:s})=>{let c=Sr(e,r);if(c.success){let e=t({ctx:c.data,out:s,exec:execToOut(s)});return e instanceof Ln?{ctx:r,out:e}:typeof e==`function`?{ctx:r,out:s,...e({ctx:r,out:s})}:{ctx:r,out:s}}throw c.error}}ur().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),ur().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),ur().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e);const Cd=hr().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),wd=vr(Mi),Td=ur().nonempty(`Icon cannot be empty`).transform(e=>e),Ed=vr(ji),Dd=vr(ki),Od=vr(Ai);vr(aa),vr([`dashed`,`solid`,`dotted`]);const kd=or(pr([ur(),lr({title:ur().optional(),url:ur()})]).transform(e=>exact(typeof e==`string`?{url:e}:e))).readonly(),Ad=vr(Ni),jd=xr().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e),Md=or(ur().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e)).readonly(),Nd=pr([ur(),yr({md:ur()}),yr({txt:ur()})]).transform(e=>typeof e==`string`?{txt:e}:e),Pd=Ad.or(jd),Fd=lr({shape:wd,icon:Td,iconColor:Pd,iconSize:Dd,iconPosition:Od,color:Pd,border:Ed,opacity:Cd,size:Dd,padding:Dd,textSize:Dd,multiple:dr()}).partial(),Id=pr([ur(),dr(),fr()]),Ld=gr(ur(),Id.or(or(Id)));lr({tags:Md.nullable(),title:ur(),summary:Nd.nullable(),description:Nd.nullable(),notation:ur().nullable(),technology:ur().nullable(),links:kd.nullable(),metadata:Ld}).partial();const titleProperty=()=>property(`title`,spaceBetween(print(`title`),text())),descriptionProperty=()=>property(`description`,spaceBetween(print(`description`),markdownOrString$1()));function colorProperty(){return property(`color`,spaceBetween(print(`color`),print()))}function opacityProperty(){return property(`opacity`,spaceBetween(print(`opacity`),print(e=>`${e}%`)))}function iconProperty(){return property(`icon`,spaceBetween(print(`icon`),print()))}zodOp(Fd)(lines(property(`shape`),colorProperty(),iconProperty(),property(`iconColor`),property(`iconSize`),property(`iconPosition`),property(`border`),opacityProperty(),property(`size`),property(`padding`),property(`textSize`),property(`multiple`)));function printOperation(e,t,r){return materialize(withctx(t??{},e),r?.indentation)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:s,projectId:c,change:u}=e,d=r.ProjectsManager.ensureProject(c),p=t.likec4.ModelLocator.locateViewAst(s,d.id);if(!p)throw Error(`View ${s} not found in project ${d.id}`);return{viewId:s,change:u,services:t,project:d,doc:p.doc,viewAst:p.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const Rd=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:s}=e,c=[];return r!==void 0&&c.push(updateViewTitle(t,r)),s!==void 0&&c.push(...updateViewDescription(t,s)),e.tag!==void 0&&c.push(...updateViewTags(t,e.tag)),c});function findExistingViewProperty(e,t){let r=e.body?.props;if(!(!r||!P(r,1)))return Ce(r,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(nonNullable(e.body,`View body is required`));if(!r)return lu.Position.create(0,0);let{line:s,character:c}=r;return lu.Position.create(s,c+1)}const doubleIndent=e=>He(newline(),indent(indent(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),s=withctx({title:t})(titleProperty());return r?lu.TextEdit.replace(r.$cstNode.range,printOperation(s)):lu.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(s)).trimEnd())}function collectAllTagRefs(e){let t=[],r=e;for(;r;){let e=[];for(let t of r.values)t.$cstNode&&e.push(t);t.push(e),r=r.prev}return t.reverse().flat()}function addTag(e,t,r){let s=t.tags;return s?.$cstNode?lu.TextEdit.insert(s.$cstNode.range.end,`, #${r}`):lu.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(print(`#${r}`))).trimEnd())}function removeTag(e,t){let r=collectAllTagRefs(e.tags),s=r.findIndex(e=>e.tag.ref?.name===t);if(s<0)return;if(r.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return lu.TextEdit.del({start:lu.Position.create(e.line,0),end:lu.Position.create(e.line+1,0)})}return}let c=r[s];if(s>0){let e=r[s-1];return lu.TextEdit.del({start:e.$cstNode.range.end,end:c.$cstNode.range.end})}let u=r[s+1];return lu.TextEdit.del({start:c.$cstNode.range.start,end:u.$cstNode.range.start})}function updateViewTags(e,t){let r=[],s=nonNullable(e.body,`View body is required`);if(t.add){let c=Array.isArray(t.add)?t.add:[t.add];for(let t of c)t&&r.push(addTag(e,s,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(s,t):void 0;e&&r.push(e)}}return r}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`),s=withctx({description:t},indent(indent(descriptionProperty())));if(r)return[lu.TextEdit.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},materialize(s).trimEnd())];let c=findInsertPosition(e,e=>N(e.props,D(e=>e.$cstNode?.range.end),F(T),Te())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[lu.TextEdit.insert({line:c.line+1,character:0},materialize(s))]}$n();const zd=Y.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:s}=e;if(s.op===`change-property`){let t=preparePayload(e,this.services),r=Rd(t);if(!r)return{success:!1,error:`No changes to apply`};let s=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,s)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let c=this.services.shared.workspace;try{let e=c.ProjectsManager.ensureProject(r);zd.debug`Applying model change ${s.op} to view ${t} in project ${e.id}`;let u=this.locator.locateViewAst(t,e.id);if(!u)throw Error(`View ${t} not found in project ${e.id}`);let d={uri:u.doc.textDocument.uri,version:u.doc.textDocument.version};if(s.op===`save-view-snapshot`)return invariant(t===s.layout.id,`View ID does not match, expected `+t+`, got `+s.layout.id),{success:!0,location:await c.ManualLayouts.write(e,s.layout)};if(s.op===`reset-manual-layout`)return{success:!0,location:await c.ManualLayouts.remove(e,t)};let{edits:p,modifiedRange:m}=this.convertToTextEdit({lookup:u,change:s});return p.length?await this.applyTextEdits(u.doc,p)?{success:!0,location:{uri:d.uri,range:m}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return zd.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}default:nonexhaustive(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,s=this.services.shared.workspace;if(!r){let r=Jt.applyEdits(e.textDocument,t);return await s.FileSystemProvider.writeFile(e.uri,r),await s.DocumentBuilder.update([e.uri],[]),!0}let c=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return c.applied?(await s.DocumentBuilder.update([e.uri],[]),c.applied):(zd.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${c.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${c.failureReason}`),!1)}},LikeC4NameProvider=class extends Qt{services;constructor(e){super(),this.services=e}getNameStrict(e){return nonNullable(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if($t(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if($t(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return N(e,se(e=>`${e.type}.${e.name}`),Re(),I(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends Vt{constructor(e){super(e)}async computeExports(e,t){let r=[];try{let{specifications:t,models:s,views:c,globals:u,likec4lib:d,deployments:p}=e.parseResult.value;this.exportLibrary(d,r,e),this.exportSpecification(t,r,e),this.exportModel(s,r,e),this.exportViews(c,r,e),this.exportGlobals(u,r,e),this.exportDeployments(p,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let s=e?.flatMap(e=>e.views);if(!(k(s)||s.length===0))for(let e of s)try{T(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(k(e)||e.length===0)){for(let s of e.flatMap(e=>e.predicates))try{let e=s;T(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let s of e.flatMap(e=>e.styles))try{let e=s.id;T(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(k(e)||e.length===0))for(let s of e.flatMap(e=>e.elements))try{isElement(s)&&T(s.name)&&t.push(this.descriptions.createDescription(s,s.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!k(e))try{for(let s of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(s,s.name,r))}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(k(e)||e.length===0))for(let s of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(s):case isSpecificationElementKind(s):T(s.kind.name)&&t.push(this.descriptions.createDescription(s.kind,s.kind.name,r));continue;case isSpecificationTag(s):T(s.tag.name)&&t.push(this.descriptions.createDescription(s.tag,s.tag.name,r));continue;case isSpecificationRelationshipKind(s):T(s.kind.name)&&t.push(this.descriptions.createDescription(s.kind,s.kind.name,r));continue;case isSpecificationColor(s):T(s.name.name)&&t.push(this.descriptions.createDescription(s.name,s.name.name,r));continue;default:nonexhaustive(s)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let s=e?.flatMap(e=>e.elements);if(!(k(s)||s.length===0))for(let e of s)try{isDeploymentNode(e)&&T(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let r=e.parseResult.value,s=[],c=new jn;for(let t of r.models)try{s.push(...this.processContainer(t,c,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{s.push(...this.processDeployments(t,c,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)s.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(s).forEach(e=>{c.add(r,e)}),t(c)})}processContainer(e,t,r){let s=new jn,c=[];for(let u of e.elements){if(isRelation(u))continue;let e;if(isElement(u)?(T(u.name)&&s.add(u.name,this.descriptions.createDescription(u,u.name,r)),e=u.body,e&&(t.add(e,this.descriptions.createDescription(u,`this`,r)),t.add(e,this.descriptions.createDescription(u,`it`,r)))):isExtendElement(u)&&(e=u.body),e&&e.elements.length>0)try{c.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}c.length&&N(c,F(e=>!s.has(e.name)),se(e=>e.name),u((e,t)=>{e.length===1&&s.add(t,e[0])}));let d=[...s.values()];return t.addAll(e,d),d}processDeployments(e,t,r){let s=new jn,c=[];for(let u of e.elements){if(isDeploymentRelation(u))continue;let e=u.body;if(!isExtendDeployment(u)){let c=this.nameProvider.getName(u);if(T(c)){let e=this.descriptions.createDescription(u,c,r);s.add(c,e)}e&&(t.add(e,this.descriptions.createDescription(u,`this`,r)),t.add(e,this.descriptions.createDescription(u,`it`,r)))}if(e)try{c.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}c.length&&N(c,F(e=>!s.has(e.name)),se(e=>e.name),u((e,t)=>{e.length===1&&s.add(t,e[0])}));let d=[...s.values()];return t.addAll(e,d),d}};const{getDocument:Bd}=Yt;var LikeC4ScopeProvider=class extends Ut{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=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let s=e.container;if(isFqnRef(s))return new Mn(this.streamForFqnRef(t,s,e));if(isStrictFqnRef(s))return this.getScopeForStrictFqnRef(t,s,e);if(r!==`Element`)return this.getProjectScope(t,r,e);if(isImported(s)){let e=projectIdFrom(s);return new Mn(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(s)&&e.property===`el`){let c=s.parent;return c?new Mn(this.fqnIndex.directChildrenOf(t,readStrictFqn(c))):this.getProjectScope(t,r,e)}return new Mn(Yn(this.computeScope(t,e)))}catch(s){return logWarnError(s),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),Wt}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r);return}if(isDeploymentNode(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*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(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let s=t.parent;return s?new Mn(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(s)).filter(e=>this.reflection.isSubtype(e.type,ys))):this.getProjectScope(e,ys,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let s=t.parent;if(!s)return Yn(this.genScopeForParentlessFqnRef(e,t,r));let c=s.value.ref;if(!c)return Sn;if(isImported(c))return Yn(this.genUniqueDescedants(c.imported.ref));if(isDeploymentNode(c))return Yn(this.genUniqueDescedants(c));if(isDeployedInstance(c)){let e=c.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return Yn(this.genUniqueDescedants(t))}return isElement(c)?Yn(this.genUniqueDescedants(c)):nonexhaustive(c)}*genScopeForParentlessFqnRef(e,t,r){fn(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,Is):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,Is),yield*this.computeScope(e,r,ys),yield*this.computeScope(e,r,_s)):(yield*this.computeScope(e,r,ys),yield*this.computeScope(e,r,_s),fn(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,Is)));let s=Bd(t).precomputedScopes;s&&(yield*s.values().filter(e=>this.reflection.isSubtype(e.type,gc)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let s=this.reflection.isSubtype(r,Is),c=this.reflection.isSubtype(r,Oo),u=Bd(t.container).precomputedScopes;if(!u){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),d=t.container;for(;d;){let e=u.get(d).filter(byReferenceType);e.length>0&&(yield*e),c&&isExtendDeploymentBody(d)&&(yield*this.genScopeExtendDeployment(d.$container)),s&&isExtendElementBody(d)&&(yield*this.genScopeExtendElement(d.$container)),s&&isElementViewBody(d)&&(yield*this.genScopeElementView(d.$container)),d=d.$container}yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===`LibIcon`?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new en(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}},Vd=rr();let Hd;(function(e){e.type=new Vd.NotificationType(`likec4/onDidChangeModel`)})(Hd||={});let Ud;(function(e){e.type=new Vd.NotificationType0(`likec4/onDidChangeProjects`)})(Ud||={});let Wd;(function(e){e.type=new Vd.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(Wd||={});let Gd;(function(e){e.type=new Vd.NotificationType(`likec4/onRequestOpenView`)})(Gd||={});let Kd;(function(e){e.req=new Vd.RequestType(`likec4/fetchComputedModel`)})(Kd||={});let qd;(function(e){e.req=new Vd.RequestType0(`likec4/fetchViewsFromAllProjects`)})(qd||={});let Jd;(function(e){e.req=new Vd.RequestType(`likec4/fetchLayoutedModel`)})(Jd||={});let Yd;(function(e){e.req=new Vd.RequestType(`likec4/layout-view`)})(Yd||={});let Xd;(function(e){e.req=new Vd.RequestType(`likec4/validate-layout`)})(Xd||={});let Zd;(function(e){e.req=new Vd.RequestType0(`likec4/reload-projects`)})(Zd||={});let Qd;(function(e){e.req=new Vd.RequestType0(`likec4/fetch-projects`)})(Qd||={});let $d;(function(e){e.req=new Vd.RequestType(`likec4/register-project`)})($d||={});let ef;(function(e){e.req=new Vd.RequestType(`likec4/build`)})(ef||={});let tf;(function(e){e.req=new Vd.RequestType(`likec4/locate`)})(tf||={});let nf;(function(e){e.req=new Vd.RequestType(`likec4/change-view`)})(nf||={});let rf;(function(e){e.req=new Vd.RequestType0(`likec4/metrics`)})(rf||={});let af;(function(e){e.req=new Vd.RequestType(`likec4/document-tags`)})(af||={});let of;(function(e){e.req=new Vd.RequestType0(`likec4/fetch-projects-overview`)})(of||={});const $=Y.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=m(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,s=r.LangiumDocuments,c=r.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(Hd.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},u=te(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),p=te(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Ud.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),m=!0;this.onDispose(_n.create(()=>{u.cancel(),p.cancel()}),t.ModelBuilder.onModelParsed(e=>u.call(e)),r.ProjectsManager.onProjectsUpdate(()=>p.call(1)),e.onRequest(Kd.req,async({projectId:e,cleanCaches:s=!1},c)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,s&&($.debug`cleanCaches: ${s}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let u=await t.ModelBuilder.computeModel(e,c);return u===Ea.EMPTY?{model:null}:{model:u.$data}}),e.onNotification(Wd.type,async e=>{let t=R.parse(e.update??e.delete),s=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await r.ManualLayouts.handleFileSystemUpdate(s)}),e.onRequest(Jd.req,async({projectId:e},r)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let s=await t.LanguageServices.layoutedModel(e);if(s===null)return{model:null};let c=await t.Views.diagrams(e,r);return{model:{...s.$data,_stage:`layouted`,views:Pe(c,e=>e.id)}}}),e.onRequest(Yd.req,async({viewId:e,projectId:r,layoutType:s,hints:c},u)=>($.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${s??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:s,layoutHints:c,cancelToken:u})})),e.onRequest(Xd.req,async({projectId:e},r)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(Qd.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:g(s.groupedByProject(),(e,t)=>{let{folderUri:s,config:{name:c,title:u}}=r.ProjectsManager.getProject(t);return{folder:s.toString(),config:{name:c,title:u},docs:D(e,e=>e.uri.toString())}})})),e.onRequest(Zd.req,async e=>{$.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest($d.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let s;return s=`configUri`in e?await r.ProjectsManager.registerConfigFile(R.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:s.id}}),e.onRequest(qd.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let s=[];for(let c of r.ProjectsManager.all){await Zt(e);try{let r=await t.Views.computedViews(c,e);s.push(...N(r,D(e=>({id:e.id,title:e.title??e.id,projectId:c})),me((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${c}:`,{error:e})}}return{views:s}}),e.onRequest(ef.req,async({docs:t},r)=>{let u=t.map(e=>R.parse(e)),isNotChanged=e=>!u.some(t=>cn.equals(t,e)),d=s.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();$.debug(`[ServerRpc] received request to build:
122
- changed (total ${u.length}):${t.map(e=>`
118
+ `))),y.start={line:d.line+1,character:p},y.end={line:d.line+e.length,character:ke(e)?.length??0}}if(_.length>0)for(let{rule:e}of _){let t=e.$cstNode;invariant(t,`RuleCstNode not found`);for(let[r,s]of be(c)){let c=r===`opacity`?s.toString()+`%`:s,u=e.props.find(e=>e.key===r);if(u&&u.$cstNode){let{range:{start:e,end:t}}=u.$cstNode;includeRange({start:e,end:t}),b.push(Zt.replace({start:e,end:t},r+` `+c));continue}let d=zd(t,`{`)?.range.end;invariant(d,`Opening brace not found`);let p=` `.repeat(t.range.start.character)+` `,m=p+r+` `+c;b.push(Zt.insert(d,`
119
+ `+m)),includeRange({start:{line:d.line+1,character:p.length},end:{line:d.line+1,character:m.length}})}}return{modifiedRange:y,edits:b}}const{findNodeForKeyword:Bd}=Jn;function changeViewLayout(e,{view:t,viewAst:r,layout:s}){invariant(r.body,`View ${t.id} has no body`);let c=r.$cstNode;invariant(c,`viewCstNode`);let u=toAstViewLayoutDirection(s.direction),d=ve(r.body.rules,isViewRuleAutoLayout),p=`autoLayout ${u}`;if(ie(s.rankSep)&&(p+=` ${s.rankSep}`,ie(s.nodeSep)&&(p+=` ${s.nodeSep}`)),d&&d.$cstNode)return Zt.replace(d.$cstNode.range,p);let m=Bd(r.body.$cstNode,`}`)?.range.start;invariant(m,`Closing brace not found`);let h=`\t${p}\n\t`;return Zt.insert(m,h)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof In&&e.contents.some(e=>hasContent(e))}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof On?!e.ifNotEmpty:e instanceof In&&e.contents.some(e=>hasContentOrNewLine(e))}function fresh(e){return{ctx:e??void 0,out:new In}}function materialize(e,t=2){return gn(v(e)?executeOnFresh(void 0,[e]).out:e.out,t).replaceAll(/\r\n/g,`
120
+ `)}function executeOnCtx(e,t,...r){ze(t)?(invariant(r.length===0,`When first argument is an array, no additional operations are allowed`),r=t):r=[t,...r];for(let t of r)e=t(e);return e}function executeOnFresh(e,t,...r){return ze(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...r])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let r=typeof e==`function`?e:t,wrapped=e=>{let t=r(e);return t instanceof In?{...e,out:t}:e};return typeof e==`string`&&r.name==``&&Object.defineProperties(wrapped,{name:{value:`wrapped(${e})`}}),wrapped}function isPrintable(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function print(e){return operation(function printOp({ctx:t,out:r}){let s=typeof e==`function`?e(t):e??t;N(s)||s===``||(invariant(isPrintable(s),`Value must be a string, number or boolean - got `+typeof s),r.append(String(s)))})}const space=()=>print(` `);function noop(){return ue()}function lazy(e){return t=>(e()(t),t)}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:r}){let s=executeOnFresh(t,e);r.appendIf(hasContent(s.out),s.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=dedent(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[qn(t.split(/\r?\n/),{separator:Un})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:r}){let s=executeOnFresh(e,t);hasContent(s.out)&&r.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:s.out.contents}).appendNewLineIfNotEmpty()})}function body(...e){let t=T(e);if(S(t))return body(t+` {`,`}`);if(e.length===2&&S(e[0])&&S(e[1])){let[t,r]=e;return(...e)=>operation(function body({ctx:s,out:c}){let u=indent(lines(...e))(fresh(s)).out;c.appendIf(hasContent(u),qn([t,u,r]))})}let r=e;return body(`{`,`}`)(...r)}function inlineText(e){return operation(({ctx:t,out:r})=>{let s=e??t;if(N(s))return;invariant(S(s),`Value must be a string - got `+typeof s);let c=s.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();r.append(`'${c}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:r}){let s=typeof e==`function`?e(t):e??t;if(!N(s))return invariant(S(s),`Value must be a string - got `+typeof s),s.includes(`
121
+ `)?multilineText(s)({ctx:s,out:r}):inlineText()({ctx:s,out:r})})}const Vd=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let r=e??t.ctx;if(!N(r))return invariant(S(r),`Value must be a string - got `+typeof r),multilineText(r,Vd)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let r=e??t.ctx;if(!N(r)){if(typeof r==`string`)return text(r)(t);if(`md`in r)return markdown(r.md)(t);if(`txt`in r)return multilineText(r.txt)(t);throw Error(`Invalid MarkdownOrString value: `+r)}})}r(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:r}){let{operations:s,...c}=e,u=Array.isArray(s)?s:[s];invariant(j(u,1),`At least one operation is required`);let d;return d=u.length===1?u[0](fresh(t)).out.contents:k(eachOnFresh(t,u),w(e=>e.out)),d=M(d,hasContentOrNewLine),r.appendIf(d.length>0,qn(d,c))})}r(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,r)=>!r&&hasContent(e)?` `:void 0})}function lines(...e){let t=T(e);if(ie(t)){let e=fresh(void 0);for(let r=0;r<t;r++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,r,s)=>s?void 0:e.out})}return join$1({operations:e,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0})}function withctx(...e){let t=e[0];if(e.length===1)return(...e)=>operation(function withctx1({out:r}){executeOnCtx({ctx:t,out:r},e)});let r=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},r)})}function property(e,t){return operation(function propertyOp({ctx:r,out:s}){let c=te(r)&&hasProp(r,e)?r[e]:void 0;if(c!=null){if(!t){invariant(isPrintable(c),`Property ${e} is not printable "${c}"`),s.append(e,` `,String(c));return}t({ctx:c,out:s})}})}function printProperty(e){return property(e,print())}function foreach(...e){let[t,r]=e;if(e.length===2&&!v(r)){let e=t,s=r;return operation(function foreachSingleOp({ctx:t,out:r}){let c=[];for(let r of t){let t=e(fresh(r)).out;hasContent(t)&&c.push(t)}r.appendIf(c.length>0,qn(c,s))})}let s=e;return operation(({ctx:e,out:t})=>{for(let r of e)executeOnCtx({ctx:r,out:t},s)})}function separateWith(e){return{separator:e}}function separateNewLine(e=1){if(e>1){let t=fresh(void 0);for(let r=0;r<e;r++)t.out.appendNewLine();return separateWith(t.out)}return separateWith(Un)}function separateComma(e){return e?{separator:`,`,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0}:{separator:`, `}}function foreachNewLine(...e){return operation(function foreachNewLineOp({ctx:t,out:r}){let s=[];for(let r of t){let t=executeOnFresh(r,e).out;hasContent(t)&&s.push(t)}r.appendIf(s.length>0,qn(s,separateNewLine()))})}function guard(e,...t){return operation(`guard`,({ctx:r,out:s})=>{if(`safeParse`in e){let c=e.safeParse(r);if(c.success)executeOnCtx({ctx:c.data,out:s},t);else throw Error(`Guard failed: ${ar(c.error)}`);return}if(invariant(typeof e==`function`),e(r)){executeOnCtx({ctx:r,out:s},t);return}})}function when(e,...t){return operation(function whenOp({ctx:r,out:s}){e(r)&&executeOnCtx({ctx:r,out:s},t)})}function select(e,...t){return operation(function selectOp({ctx:r,out:s}){let c=e(r);ce(c)&&executeOnCtx({ctx:c,out:s},t)})}function execToOut(e){return(t,...r)=>executeOnCtx({ctx:t,out:e},r)}function zodOp(e){return t=>()=>({ctx:r,out:s})=>{let c=cr(e,r);if(c.success){let e=t({ctx:c.data,out:s,exec:execToOut(s)});return e instanceof In?{ctx:r,out:e}:typeof e==`function`?{ctx:r,out:s,...e({ctx:r,out:s})}:{ctx:r,out:s}}throw c.error}}var Hd=t({arrow:()=>$d,border:()=>Xd,color:()=>lf,customColor:()=>af,fqn:()=>Gd,icon:()=>Yd,iconPosition:()=>Qd,id:()=>Ud,kind:()=>Kd,line:()=>ef,link:()=>tf,links:()=>nf,markdownOrString:()=>cf,metadata:()=>ff,metadataValue:()=>df,opacity:()=>qd,props:()=>pf,shape:()=>Jd,size:()=>Zd,style:()=>uf,tag:()=>of,tags:()=>sf,themeColor:()=>rf,viewId:()=>Wd});const Ud=R().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`),Wd=Ud.transform(e=>e),Gd=R().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),Kd=R().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),qd=gr().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),Jd=pr(Ri),Yd=R().nonempty(`Icon cannot be empty`).transform(e=>e),Xd=pr(Li),Zd=pr(Fi),Qd=pr(Ii),$d=pr(_a),ef=pr(ga),tf=L([R(),z({title:R().optional(),url:R()})]).transform(e=>exact(typeof e==`string`?{url:e}:e)),nf=F(tf).readonly(),rf=pr(zi),af=R().nonempty(`Custom color name cannot be empty`).transform(e=>e),of=R().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e),sf=F(of).readonly(),cf=L([R().transform(e=>({txt:e})),or({md:R()}),or({txt:R()})]),lf=rf.or(af),uf=z({shape:Jd,icon:Yd,iconColor:lf,iconSize:Zd,iconPosition:Qd,color:lf,border:Xd,opacity:qd,size:Zd,padding:Zd,textSize:Zd,multiple:sr()}).partial().transform(Qe(ce)),df=L([R(),sr(),ir()]),ff=mr(R(),df.or(F(df))),pf=z({tags:sf.nullish(),title:R().nullish(),summary:cf.nullish(),description:cf.nullish(),notation:R().nullish(),technology:R().nullish(),links:nf.nullish(),metadata:ff.nullish()});var mf=t({directRelationExpr:()=>zf,elementKindExpr:()=>Af,elementTagExpr:()=>jf,expression:()=>Jf,fqnExpr:()=>Mf,fqnExprAny:()=>Rf,fqnExprCustom:()=>Lf,fqnExprOrWhere:()=>Nf,fqnRef:()=>_f,incomingRelationExpr:()=>Bf,inoutRelationExpr:()=>Hf,outgoingRelationExpr:()=>Vf,refDeployment:()=>gf,refExpr:()=>kf,refModel:()=>hf,relationExpr:()=>Uf,relationExprAny:()=>Kf,relationExprCustom:()=>Gf,relationExprOrWhere:()=>Wf,selector:()=>vf,whereAnd:()=>wf,whereExpr:()=>qf,whereKind:()=>bf,whereMetadata:()=>xf,whereNot:()=>Tf,whereOperator:()=>Df,whereOr:()=>Ef,whereParticipant:()=>Cf,whereTag:()=>yf,wildcardExpr:()=>Of});const hf=or({model:Gd,project:R().optional()}),gf=or({deployment:Gd,element:Gd.nullish()}),_f=L([hf,gf]),vf=pr([`children`,`expanded`,`descendants`]);function equalOp(e){return L([e.transform(e=>({eq:e})),z({eq:e}),z({neq:e})])}const yf=z({tag:equalOp(of)}),bf=z({kind:equalOp(Kd)}),xf=z({metadata:z({key:R(),value:equalOp(R()).optional()})}),Sf=L([yf,bf,xf]),Cf=z({participant:pr([`source`,`target`]),operator:Sf}),wf=z({get and(){return F(Df)}}),Tf=z({get not(){return Df}}),Ef=z({get or(){return F(Df)}}),Df=L([yf,bf,xf,Cf,wf,Ef,Tf]),Of=z({wildcard:pr(!0)}),kf=z({ref:_f,selector:vf.optional()}),Af=z({elementKind:Kd,isEqual:sr()}),jf=z({elementTag:of,isEqual:sr()}),Mf=L([Of,kf,Af,jf]),Nf=L([Mf,or({where:or({expr:Mf,condition:Df})})]),Pf=z({title:R(),description:cf,technology:R(),notation:R(),notes:cf,navigateTo:Wd,color:lf}),Ff=z({...Pf.shape,shape:Jd,icon:Yd,iconColor:lf,iconSize:Zd,iconPosition:Qd,border:Xd,opacity:qd,multiple:sr(),size:Zd,padding:Zd,textSize:Zd}).partial(),If=z({...Pf.shape,line:ef,head:$d,tail:$d}).partial(),Lf=or({custom:Ff.extend({expr:Nf})}),Rf=L([Nf,Lf]),zf=z({source:Mf,target:Mf,isBidirectional:sr().optional()}),Bf=z({incoming:Mf}),Vf=z({outgoing:Mf}),Hf=z({inout:Mf}),Uf=L([zf,Bf,Vf,Hf]),Wf=L([Uf,or({where:or({expr:Uf,condition:Df})})]),Gf=or({customRelation:If.extend({expr:Wf})}),Kf=L([Wf,Gf]),qf=z({where:z({expr:L([Mf,Uf]),condition:Df})}),Jf=L([Mf,Lf,Uf,Gf,qf]);var Yf=t({element:()=>tp,instance:()=>Zf,node:()=>Xf,relationship:()=>ep,schema:()=>ap});const Xf=pf.extend({id:Gd,kind:Kd,style:uf.optional(),shape:Jd.optional(),color:lf.optional(),icon:Yd.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:s,...c}=e;return Qe(Ct(c,e=>{e.style=c.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),s&&(e.style.icon=s)}),ce)}),Zf=pf.extend({id:Gd,element:Gd,style:uf.optional(),shape:Jd.optional(),color:lf.optional(),icon:Yd.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:s,...c}=e;return Qe(Ct(c,e=>{e.style=c.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),s&&(e.style.icon=s)}),ce)}),Qf=gf,$f=Ud.transform(e=>e),ep=pf.extend({id:$f.optional(),title:R().nullish(),source:Qf,target:Qf,navigateTo:Wd.nullish(),color:lf.nullish(),kind:Kd.nullish(),line:ef.nullish(),head:$d.nullish(),tail:$d.nullish()}).readonly().transform(Qe(ce)),tp=L([Xf,Zf]),np=mr(Gd,tp),rp=mr($f,ep),ip=r(e=>e.id??Me(8),`genRelationshipId`),ap=z({elements:L([np,F(tp)]).transform(e=>ze(e)?b(e,D(`id`)):e).optional(),relations:L([rp,F(ep)]).transform(e=>ze(e)?b(e,ip):e).optional()});var op=t({element:()=>sp,relationship:()=>up,schema:()=>pp});const sp=z({...pf.shape,id:Gd,kind:Kd,style:uf.optional(),shape:Jd.optional(),color:lf.optional(),icon:Yd.optional()}).transform(e=>{let{shape:t,color:r,icon:s,...c}=e;return(t||r||s)&&(c=Ct(c,e=>{e.style=c.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),s&&(e.style.icon=s)})),Qe(c,ce)}).readonly(),cp=L([Gd,or({model:Gd})]).transform(e=>typeof e==`string`?{model:e}:e),lp=Ud.transform(e=>e),up=z({...pf.shape,id:lp.optional(),title:R().nullish(),source:cp,target:cp,navigateTo:Wd.nullish(),color:lf.nullish(),kind:Kd.nullish(),line:ef.nullish(),head:$d.nullish(),tail:$d.nullish()}).transform(Qe(ce)).readonly(),dp=mr(Gd,sp),fp=mr(lp,up),genRelationshipId=e=>e.id??Me(8),pp=z({elements:L([dp,F(sp)]).transform(e=>ze(e)?b(e,D(`id`)):e).optional(),relations:L([fp,F(up)]).transform(e=>ze(e)?b(e,genRelationshipId):e).optional()});var mp=t({element:()=>hp,relationship:()=>gp,schema:()=>vp,tagSpec:()=>_p});const hp=z({tags:sf.nullable(),title:R().nullable(),summary:cf.nullable(),description:cf.nullable(),technology:R().nullable(),notation:R().nullable(),links:nf.nullable(),style:uf.nullable()}).partial().transform(Qe(ce)),gp=z({technology:R().nullable(),notation:R().nullable(),color:lf.nullable(),line:ef.nullable(),head:$d.nullable(),tail:$d.nullable()}).partial().transform(Qe(ce)),_p=z({color:R().regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/).optional().catch(void 0)}).partial().transform(Qe(ce)),vp=z({elements:mr(Kd,hp),deployments:mr(Kd,hp),relationships:mr(Kd,gp),tags:L([mr(of,_p),F(of).transform(e=>m(e,e=>[e,{}]))])}).partial();var yp=t({anyView:()=>Yp,autoLayoutDirection:()=>bp,deploymentView:()=>Ip,deploymentViewRule:()=>Fp,deploymentViewRuleIncludeAncestors:()=>Sp,dynamicStep:()=>Lp,dynamicStepAlt:()=>Up,dynamicStepAltBranch:()=>Hp,dynamicStepBlock:()=>Bp,dynamicStepSeries:()=>zp,dynamicStepTry:()=>Vp,dynamicView:()=>Jp,dynamicViewIncludeRule:()=>Gp,dynamicViewRule:()=>Kp,dynamicViewStep:()=>Wp,dynamicViewVariant:()=>qp,elementView:()=>Pp,elementViewRule:()=>Mp,viewRuleAutoLayout:()=>xp,viewRuleExclude:()=>wp,viewRuleGlobalPredicate:()=>Op,viewRuleGlobalStyle:()=>Dp,viewRuleGroup:()=>jp,viewRuleInclude:()=>Cp,viewRulePredicate:()=>Tp,viewRuleRank:()=>Ap,viewRuleStyle:()=>Ep,views:()=>Xp});const bp=pr([`TB`,`BT`,`LR`,`RL`]),xp=z({direction:bp,nodeSep:ir().optional(),rankSep:ir().optional()}),Sp=or({includeAncestors:sr()}),Cp=or({include:F(Jf)}),wp=or({exclude:F(Jf)}),Tp=L([Cp,wp]).transform(e=>e),Ep=z({targets:F(Mf),notation:R().optional(),style:uf}).transform(e=>e),Dp=z({styleId:R()}).transform(e=>e),Op=z({predicateId:R()}).transform(e=>e),kp=pr([`max`,`min`,`same`,`sink`,`source`]),Ap=z({targets:F(Mf),rank:kp}).transform(e=>e),jp=dr(()=>z({groupRules:F(L([Tp,jp])),title:R().nullable(),color:lf.optional(),border:Xd.optional(),opacity:qd.optional(),multiple:sr().optional(),size:Zd.optional(),padding:Zd.optional(),textSize:Zd.optional()})),Mp=L([Tp,xp,Ep,Dp,Op,Ap,jp]),Np=z({id:Wd,title:R().nullish(),description:cf.nullish(),tags:sf.nullish(),links:nf.nullish()}),Pp=Np.extend({_type:pr(`element`),viewOf:Gd.nullish(),extends:Wd.nullish(),rules:F(Mp).optional().default([])}),Fp=L([Tp,xp,Ep,Dp,Op,Sp]),Ip=Np.extend({_type:pr(`deployment`),rules:F(Fp).optional().default([])}),Lp=z({_type:lr().exactOptional(),source:Gd,target:Gd,title:R().nullish().default(null),kind:R().nullish(),description:cf.nullish(),technology:R().nullish(),notation:R().nullish(),notes:cf.nullish(),color:lf.optional(),line:ef.optional(),head:$d.optional(),tail:$d.optional(),isBackward:sr().optional(),navigateTo:Wd.nullish()}),Rp=z({title:R().optional(),source:lr().exactOptional(),target:lr().exactOptional(),get steps(){return F(Wp).nonempty(`must have at least one step`)}}),zp=z({_type:pr(`series`),steps:F(Lp).nonempty(`must have at least one step`)}).readonly(),Bp=Rp.extend({_type:pr([`par`,`loop`,`opt`,`break`])}).readonly(),Vp=z({_type:pr(`try`),try:Rp,catch:Rp.optional(),finally:Rp.optional()}).readonly(),Hp=Rp.extend({_type:pr([`when`,`if`,`else`])}).readonly(),Up=z({_type:pr(`alt`),title:R().optional(),branches:F(Hp).nonempty(`alt block must have at least one branch`)}).readonly(),Wp=L([Lp,Up,zp,Bp,Vp]),Gp=or({include:F(Jf)}),Kp=L([Gp,Op,Ep,Dp,xp]),qp=pr([`diagram`,`sequence`]),Jp=Np.extend({_type:pr(`dynamic`),variant:qp.optional(),steps:F(Wp).optional(),rules:F(Kp).optional()}),Yp=L([Pp,Ip,Jp]),Xp=mr(Wd,Yp),Zp=z({...pp.shape,views:Xp,project:z({id:R(),styles:Co.nullish()}),deployment:ap,deployments:ap,specification:vp}).partial().readonly().transform(normalizeStyles);function normalizeStyles(e){let t=e.specification?.elements;return!se(t)&&!se(e.elements)&&(e={...e,elements:h(e.elements,e=>normalizeElementStyles(e,t))}),e}function normalizeElementStyles(e,t){let r=t[e.kind];if(!r)return e;let s=r.style??{};return Ct(e,t=>{for(let s of[`description`,`technology`,`tags`,`summary`]){let c=r[s],u=e[s];le(c,u)&&delete t[s]}if(e.style)for(let[r,c]of be(s))le(e.style?.[r],c)&&delete t.style[r]})}const $={common:Hd,expr:mf,specification:mp,model:op,deployment:Yf,views:yp,likec4data:Zp};function markdownProperty(e,t){return select(t=>t[e],spaceBetween(print(t??e),markdownOrString$1()))}const titleProperty=()=>property(`title`,spaceBetween(print(`title`),text())),summaryProperty=()=>property(`summary`,spaceBetween(print(`summary`),markdownOrString$1())),descriptionProperty=()=>property(`description`,spaceBetween(print(`description`),markdownOrString$1())),notesProperty=()=>property(`notes`,spaceBetween(print(`notes`),markdownOrString$1())),technologyProperty=()=>property(`technology`,spaceBetween(print(`technology`),text())),notationProperty=()=>property(`notation`,spaceBetween(print(`notation`),text()));function printMetadataValue(){return operation(({ctx:e,out:t})=>S(e)?text()({ctx:e,out:t}):print()({ctx:e,out:t}))}function metadataValue(){return qe(guard(d(ze),printMetadataValue()),guard(ze,body(`[`,`]`)(foreach(printMetadataValue(),{appendNewLineIfNotEmpty:!0,suffix(e,t,r){return r?void 0:`,`}}))))}const metadataProperty=()=>select(e=>e.metadata?be(e.metadata):void 0,body(`metadata`)(foreach(spaceBetween(print(e=>e[0]),property(`1`,metadataValue())),separateNewLine()))),tagsProperty=()=>property(`tags`,print(e=>e.map(e=>`#${e}`).join(`, `)));function linkProperty(){return spaceBetween(select(e=>typeof e==`string`?{url:e}:exact({url:e.url,title:e.title}),print(`link`),print(e=>e.url),property(`title`,inlineText())))}const linksProperty=()=>property(`links`,foreachNewLine(linkProperty()));function colorProperty(){return property(`color`,spaceBetween(print(`color`),print()))}function opacityProperty(){return property(`opacity`,spaceBetween(print(`opacity`),print(e=>`${e}%`)))}function iconProperty(){return property(`icon`,spaceBetween(print(`icon`),print()))}const Qp=zodOp(uf)(lines(property(`shape`),colorProperty(),iconProperty(),property(`iconColor`),property(`iconSize`),property(`iconPosition`),property(`border`),opacityProperty(),property(`size`),property(`padding`),property(`textSize`),property(`multiple`)));function appendSelector(e,t){if(t)switch(t){case`children`:e.append(`.*`);break;case`descendants`:e.append(`.**`);break;case`expanded`:e.append(`._`);break;default:nonexhaustive(t)}return e}const $p=zodOp(yf)(function whereTagEqualOp({ctx:{tag:e},out:t}){if(`eq`in e)return t.appendTemplate`tag is #${e.eq}`;if(`neq`in e)return t.appendTemplate`tag is not #${e.neq}`;nonexhaustive(e)}),em=zodOp(bf)(function whereKindEqualOp({ctx:{kind:e},out:t}){if(`eq`in e)return t.appendTemplate`kind is ${e.eq}`;if(`neq`in e)return t.appendTemplate`kind is not ${e.neq}`;nonexhaustive(e)});function quoteMetadataValue(e){return e===`true`||e===`false`?e:`"${e}"`}const tm=zodOp(xf)(function whereMetadataEqualOp({ctx:{metadata:e},out:t}){let{key:r,value:s}=e;if(s===void 0)return t.appendTemplate`metadata.${r}`;if(`eq`in s)return t.append(`metadata.${r} is ${quoteMetadataValue(s.eq)}`);if(`neq`in s)return t.append(`metadata.${r} is not ${quoteMetadataValue(s.neq)}`);nonexhaustive(s)}),nm=zodOp(Tf)(property(`not`,spaceBetween(print(`not (`),lazy(()=>om()),print(`)`)))),rm=zodOp(Cf)(function whereParticipantOp({ctx:{participant:e,operator:t},out:r}){if(r.append(e,`.`),`tag`in t){$p()({ctx:t,out:r});return}if(`kind`in t){em()({ctx:t,out:r});return}if(`metadata`in t){tm()({ctx:t,out:r});return}nonexhaustive(t)}),im=zodOp(wf)(function whereAndOp({ctx:{and:e},out:t}){let r=w(e,e=>{let{out:t}=executeOnFresh(e,om());return`or`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(qn(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`and `:void 0}}))}),am=zodOp(Ef)(({ctx:{or:e},out:t})=>{let r=w(e,e=>{let{out:t}=executeOnFresh(e,om());return`and`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(qn(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`or `:void 0}}))}),om=zodOp(Df)(({ctx:e,exec:t})=>{if(`and`in e)return t(e,im());if(`or`in e)return t(e,am());if(`not`in e)return t(e,nm());if(`tag`in e)return t(e,$p());if(`kind`in e)return t(e,em());if(`metadata`in e)return t(e,tm());if(`participant`in e)return t(e,rm());nonexhaustive(e)}),sm=zodOp(_f)(({ctx:e,out:t})=>(`model`in e?t.append(e.model):(t.append(e.deployment),e.element&&t.append(`.`,e.element)),t)),cm=zodOp(Mf)(({ctx:e,out:t,exec:r})=>{if(`wildcard`in e)return t.append(`*`);if(`elementKind`in e)return t.append(`element.kind`).append(e.isEqual?` = `:` != `).append(e.elementKind);if(`elementTag`in e)return t.append(`element.tag`).append(e.isEqual?` = `:` != `).append(`#${e.elementTag}`);if(`ref`in e)return r(e.ref,sm()),appendSelector(t,e.selector),t;nonexhaustive(e)}),lm=zodOp(Lf)(({ctx:{custom:e},exec:t})=>{t(e.expr,um());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),notesProperty(),property(`navigateTo`),Qp()));return`where`in e.expr?t({},indent(r)):t({},space(),r)}),um=zodOp(Nf)(({ctx:e,exec:t})=>{if(`where`in e){t(e.where.expr,cm()),t(e.where.condition,indent(print(`where`),indent(om())));return}t(e,cm())});zodOp(Rf)(({ctx:e,out:t})=>`custom`in e?lm()({ctx:e,out:t}):um()({ctx:e,out:t}));const dm=zodOp(zf)(merge(property(`source`,cm()),print(e=>e.isBidirectional?` <-> `:` -> `),property(`target`,cm()))),fm=zodOp(Bf)(merge(print(`-> `),property(`incoming`,cm()))),pm=zodOp(Vf)(merge(property(`outgoing`,cm()),print(` ->`))),mm=zodOp(Hf)(merge(print(`-> `),property(`inout`,cm()),print(` ->`))),hm=zodOp(Uf)(({ctx:e,exec:t})=>{if(`source`in e)return t(e,dm());if(`incoming`in e)return t(e,fm());if(`outgoing`in e)return t(e,pm());if(`inout`in e)return t(e,mm());nonexhaustive(e)}),gm=zodOp(Wf)(({ctx:e,out:t})=>`where`in e?merge(withctx(e.where.expr)(hm()),indent(print(`where`),indent(withctx(e.where.condition)(om()))))({ctx:e,out:t}):hm()({ctx:e,out:t})),_m=zodOp(Gf)(({ctx:{customRelation:e},exec:t})=>{t(e.expr,gm());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),markdownProperty(`notes`),property(`navigateTo`),Qp(),property(`head`),property(`tail`),property(`line`)));`where`in e.expr?t({},indent(r)):t({},space(),r)});zodOp(Kf)(({ctx:e,exec:t})=>`customRelation`in e?t(e,_m()):t(e,gm()));const vm=zodOp(Jf)(({ctx:e,exec:t})=>{if(`custom`in e)return t(e,lm());if(`customRelation`in e)return t(e,_m());if(`wildcard`in e||`ref`in e||`elementKind`in e||`elementTag`in e)return t(e,cm());if(`source`in e||`incoming`in e||`outgoing`in e||`inout`in e)return t(e,hm());if(`where`in e){let{expr:r,condition:s}=e.where;return`source`in r||`incoming`in r||`outgoing`in r||`inout`in r?t({where:{expr:r,condition:s}},gm()):t({where:{expr:r,condition:s}},um())}nonexhaustive(e)});function buildTree$1(e){let t=new Map,r=[],s=k(e,sortParentsFirst);for(let e of s){let s;s=`element`in e?e:{...e,children:[]},t.set(e.id,s);let c=parentFqn(e.id),u=c?t.get(c):void 0;u&&`children`in u?u.children.push(s):r.push(s)}return{roots:r,nodes:t,exists:e=>t.has(e)}}r(buildTree$1,`buildTree`);function hasStyleProps$1(e){return!se(e.style)}r(hasStyleProps$1,`hasStyleProps`);function hasElementProps$1(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!se(e.metadata)||hasStyleProps$1(e))}r(hasElementProps$1,`hasElementProps`);const ym=zodOp($.deployment.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps$1(e)?e.style:void 0,body(`style`)(Qp())))),bm=zodOp($.deployment.instance)(spaceBetween(when(e=>nameFromFqn(e.id)!==nameFromFqn(e.element),print(e=>nameFromFqn(e.id)),print(` =`)),print(`instanceOf`),printProperty(`element`),when(e=>!!e.title&&e.title!==nameFromFqn(e.id),property(`title`,inlineText())),when(e=>hasElementProps$1(e),body(ym()))));function node(){return function nodeOp({ctx:e,out:t}){let r=e;if(`element`in r)return bm()({ctx:r,out:t}),{ctx:e,out:t};invariant(`children`in r,`Node must have children property`);let s=r.children.length>0||hasElementProps$1(r),c=nameFromFqn(r.id),u=[print(c),print(`=`),print(r.kind)];return r.title&&r.title!==c&&u.push(inlineText(r.title)),s&&u.push(body(lines(2)(withctx(r,ym()),...r.children.map(e=>withctx(e,nodeOp))))),spaceBetween(...u)({ctx:e,out:t})}}function hasRelationStyle$1(e){return!!(e.color||e.line||e.head||e.tail)}r(hasRelationStyle$1,`hasRelationStyle`);function hasRelationProps$1(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!se(e.metadata)||hasRelationStyle$1(e)||e.navigateTo)}r(hasRelationProps$1,`hasRelationProps`);const xm=zodOp($.deployment.relationship)(spaceBetween(property(`source`,sm()),print(e=>e.kind?`-[${e.kind}]->`:`->`),property(`target`,sm()),property(`title`,inlineText()),when(hasRelationProps$1,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle$1,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`))))))),Sm=zodOp($.deployment.schema)(body(`deployment`)(lines(2)(select(e=>buildTree$1(e.elements?Be(e.elements):[]).roots,lines(2)(foreach(node()))),select(e=>e.relations?Be(e.relations):void 0,lines(2)(foreach(xm()))))));function buildTree(e){let t=new Map,r=[],s=k(e,sortParentsFirst);for(let e of s){let s={...e,children:[]};t.set(e.id,s);let c=parentFqn(e.id),u=c?t.get(c):void 0;u?u.children.push(s):r.push(s)}return{roots:r,nodes:t,exists:e=>t.has(e)}}function hasStyleProps(e){return!se(e.style)}function hasElementProps(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!se(e.metadata)||hasStyleProps(e))}const Cm=zodOp($.model.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps(e)?e.style:void 0,body(`style`)(Qp()))));function elementTree(){return function elementTreeNodeOp({ctx:e,out:t}){let r=e,s=(e.children?.length??0)>0||hasElementProps(r),c=nameFromFqn(r.id),u=[print(c),print(`=`),print(r.kind)];return r.title&&r.title!==c&&u.push(inlineText(r.title)),s&&u.push(body(lines(2)(withctx(r,Cm()),...(e.children??[]).map(e=>withctx(e,elementTree()))))),spaceBetween(...u)({ctx:e,out:t})}}function hasRelationStyle(e){return!!(e.color||e.line||e.head||e.tail)}function hasRelationProps(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!se(e.metadata)||hasRelationStyle(e)||e.navigateTo)}const wm=zodOp($.model.relationship)(spaceBetween(property(`source`,sm()),print(e=>e.kind?`-[${e.kind}]->`:`->`),property(`target`,sm()),property(`title`,inlineText()),when(hasRelationProps,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`)))))));zodOp($.model.element)(elementTree());const Tm=zodOp($.model.schema)(body(`model`)(lines(2)(select(e=>buildTree(e.elements?Be(e.elements):[]).roots,lines(2)(foreach(elementTree()))),select(e=>e.relations?Be(e.relations):void 0,lines(2)(foreach(wm())))))),Em=zodOp(_r([R(),_p]))(spaceBetween(print(`tag`),printProperty(`0`),property(`1`,property(`color`,body(spaceBetween(print(`color`),print())))))),elementKind=e=>zodOp(_r([R(),hp]))(spaceBetween(print(e),printProperty(`0`),property(`1`,body(tagsProperty(),titleProperty(),summaryProperty(),descriptionProperty(),technologyProperty(),notationProperty(),linksProperty(),property(`style`,body(`style`)(Qp())))))),Dm=zodOp(_r([R(),gp]))(spaceBetween(print(`relationship`),printProperty(`0`),property(`1`,body(technologyProperty(),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),Om=zodOp(vp)(body(`specification`)(lines(2)(select(e=>e.elements&&be(e.elements),foreachNewLine(elementKind(`element`)())),select(e=>e.deployments&&be(e.deployments),foreachNewLine(elementKind(`deploymentNode`)())),select(e=>e.relationships&&be(e.relationships),foreachNewLine(Dm())),select(e=>e.tags&&be(e.tags),foreachNewLine(Em()))))),viewTitleProperty=()=>property(`title`,spaceBetween(print(`title`),inlineText())),km=zodOp($.views.viewRulePredicate)(({ctx:e,exec:t})=>{let r,s;if(`include`in e?(r=e.include,s=`include`):`exclude`in e&&(r=e.exclude,s=`exclude`),invariant(r&&s,`Invalid view rule predicate`),!j(r,1))return;let c=j(r,2),u=withctx(r)(foreach(vm(),separateComma(c)));t(e,merge(print(s),...c?[indent(u)]:[space(),u]))}),Am=zodOp($.views.viewRuleStyle)(spaceBetween(print(`style`),property(`targets`,foreach(vm(),separateComma())),body(`{`,`}`)(notationProperty(),property(`style`,Qp())))),jm=zodOp($.views.viewRuleGroup)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Mm=zodOp($.views.viewRuleGlobalStyle)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Nm=zodOp($.views.viewRuleGlobalPredicate)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Pm={TB:`TopBottom`,BT:`BottomTop`,LR:`LeftRight`,RL:`RightLeft`},Fm=zodOp($.views.viewRuleAutoLayout)(spaceBetween(print(`autoLayout`),property(`direction`,print(e=>Pm[e])),guard(hasProp(`rankSep`),spaceBetween(printProperty(`rankSep`),printProperty(`nodeSep`))))),Im=zodOp($.views.deploymentViewRuleIncludeAncestors)(spaceBetween(print(`includeAncestors`),printProperty(`includeAncestors`))),Lm=zodOp($.views.viewRuleRank)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Rm=zodOp($.views.elementViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,km());if(`groupRules`in e)return t(e,jm());if(`rank`in e)return t(e,Lm());if(`direction`in e)return t(e,Fm());if(`styleId`in e)return t(e,Mm());if(`predicateId`in e)return t(e,Nm());if(`targets`in e&&`style`in e)return t(e,Am());nonexhaustive(e)}),zm=zodOp($.views.elementView.partial({_type:!0}))(spaceBetween(print(`view`),print(e=>e.id),property(`viewOf`,spaceBetween(print(`of`),print())),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine(Rm())))))),Bm=zodOp($.views.deploymentViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,km());if(`includeAncestors`in e)return t(e,Im());if(`direction`in e)return t(e,Fm());if(`styleId`in e)return t(e,Mm());if(`predicateId`in e)return t(e,Nm());if(`targets`in e&&`style`in e)return t(e,Am());nonexhaustive(e)}),Vm=zodOp($.views.deploymentView.partial({_type:!0}))(spaceBetween(print(`deployment view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine(Bm())))))),Hm=zodOp($.views.dynamicStep.partial({source:!0}))(spaceBetween(print(e=>e.isBackward?`<-`:e.kind?`-[${e.kind}]->`:`->`),printProperty(`target`),property(`title`,text()),body(lines(technologyProperty(),descriptionProperty(),notesProperty(),property(`navigateTo`),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),Um=zodOp($.views.dynamicStep)(spaceBetween(printProperty(`source`),Hm())),bodyWithSteps=()=>property(`steps`,body(foreachNewLine(lazy(()=>Ym())))),Wm=zodOp($.views.dynamicStepBlock)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),Gm=zodOp($.views.dynamicStepSeries)(merge(select(e=>e.steps[0],printProperty(`source`)),indent(property(`steps`,foreachNewLine(Hm()))))),Km=zodOp($.views.dynamicStepTry)(spaceBetween(select(e=>e.try,spaceBetween(print(`try`),property(`title`,text()),bodyWithSteps())),select(e=>e.catch,spaceBetween(print(`catch`),property(`title`,text()),bodyWithSteps())),select(e=>e.finally,spaceBetween(print(`finally`),property(`title`,text()),bodyWithSteps())))),qm=zodOp($.views.dynamicStepAltBranch)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),Jm=zodOp($.views.dynamicStepAlt)(spaceBetween(print(`alt`),property(`title`,text()),body(property(`branches`,foreachNewLine(qm()))))),Ym=zodOp($.views.dynamicViewStep)(({ctx:e,exec:t})=>{if(e.source&&e.target)return t(e,Um());switch(invariant(e._type,`Step must have a type`),e._type){case`loop`:case`opt`:case`break`:case`par`:return t(e,Wm());case`alt`:return t(e,Jm());case`series`:return t(e,Gm());case`try`:return t(e,Km());default:nonexhaustive(e)}}),Xm={single:Um,block:Wm,alt:Jm,series:Gm,try:Km,any:Ym},Zm=zodOp($.views.dynamicViewIncludeRule)(({ctx:e,exec:t})=>{if(!j(e.include,1))return;let r=j(e.include,2),s=withctx(e.include)(foreach(vm(),separateComma(r)));t(e,merge(print(`include`),...r?[indent(s)]:[space(),s]))}),Qm=zodOp($.views.dynamicViewRule)(({ctx:e,exec:t})=>{if(`include`in e)return t(e,Zm());if(`predicateId`in e)return t(e,Nm());if(`targets`in e&&`style`in e)return t(e,Am());if(`styleId`in e)return t(e,Mm());if(`direction`in e)return t(e,Fm());nonexhaustive(e)}),$m=zodOp($.views.dynamicView.partial({_type:!0}))(spaceBetween(print(`dynamic view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),descriptionProperty(),linksProperty(),property(`variant`)),property(`steps`,foreachNewLine(Xm.any())),property(`rules`,foreachNewLine(Qm())))))),eh=zodOp($.views.anyView)(({ctx:e,exec:t})=>{if(`_type`in e){if(e._type==`element`)return t(e,zm());if(e._type===`deployment`)return t(e,Vm());if(e._type===`dynamic`)return t(e,$m())}nonexhaustive(e)}),th=zodOp($.views.views)(body(`views`)(select(e=>Be(e),foreach(eh(),{separator:new In().appendNewLine().appendNewLine(),prefix:(e,t,r)=>t===0&&!r?Un:void 0})))),nh=zodOp($.likec4data)(lines(2)(property(`specification`,Om()),Tm(),property(`deployment`,Sm()),property(`deployments`,Sm()),property(`views`,th())));function generateLikeC4(e,t){return t={indentation:2,...t},materialize(withctx(e,nh()),t.indentation)}function printOperation(e,t,r){return materialize(withctx(t??{},e),r?.indentation)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:s,projectId:c,change:u}=e,d=r.ProjectsManager.ensureProject(c),p=t.likec4.ModelLocator.locateViewAst(s,d.id);if(!p)throw Error(`View ${s} not found in project ${d.id}`);return{viewId:s,change:u,services:t,project:d,doc:p.doc,viewAst:p.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const rh=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:s}=e,c=[];return r!==void 0&&c.push(updateViewTitle(t,r)),s!==void 0&&c.push(...updateViewDescription(t,s)),e.tag!==void 0&&c.push(...updateViewTags(t,e.tag)),c});function findExistingViewProperty(e,t){let r=e.body?.props;if(!(!r||!j(r,1)))return ve(r,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(nonNullable(e.body,`View body is required`));if(!r)return ui.create(0,0);let{line:s,character:c}=r;return ui.create(s,c+1)}const doubleIndent=e=>qe(newline(),indent(indent(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),s=withctx({title:t})(titleProperty());return r?di.replace(r.$cstNode.range,printOperation(s)):di.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(s)).trimEnd())}function collectAllTagRefs(e){let t=[],r=e;for(;r;){let e=[];for(let t of r.values)t.$cstNode&&e.push(t);t.push(e),r=r.prev}return t.reverse().flat()}function addTag(e,t,r){let s=t.tags;return s?.$cstNode?di.insert(s.$cstNode.range.end,`, #${r}`):di.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(print(`#${r}`))).trimEnd())}function removeTag(e,t){let r=collectAllTagRefs(e.tags),s=r.findIndex(e=>e.tag.ref?.name===t);if(s<0)return;if(r.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return di.del({start:ui.create(e.line,0),end:ui.create(e.line+1,0)})}return}let c=r[s];if(s>0){let e=r[s-1];return di.del({start:e.$cstNode.range.end,end:c.$cstNode.range.end})}let u=r[s+1];return di.del({start:c.$cstNode.range.start,end:u.$cstNode.range.start})}function updateViewTags(e,t){let r=[],s=nonNullable(e.body,`View body is required`);if(t.add){let c=Array.isArray(t.add)?t.add:[t.add];for(let t of c)t&&r.push(addTag(e,s,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(s,t):void 0;e&&r.push(e)}}return r}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`),s=withctx({description:t},indent(indent(descriptionProperty())));if(r)return[di.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},materialize(s).trimEnd())];let c=findInsertPosition(e,e=>k(e.props,w(e=>e.$cstNode?.range.end),M(x),ke())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[di.insert({line:c.line+1,character:0},materialize(s))]}const ih=Y.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:s}=e;if(s.op===`change-property`){let t=preparePayload(e,this.services),r=rh(t);if(!r)return{success:!1,error:`No changes to apply`};let s=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,s)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let c=this.services.shared.workspace;try{let e=c.ProjectsManager.ensureProject(r);ih.debug`Applying model change ${s.op} to view ${t} in project ${e.id}`;let u=this.locator.locateViewAst(t,e.id);if(!u)throw Error(`View ${t} not found in project ${e.id}`);let d={uri:u.doc.textDocument.uri,version:u.doc.textDocument.version};if(s.op===`save-view-snapshot`)return invariant(t===s.layout.id,`View ID does not match, expected `+t+`, got `+s.layout.id),{success:!0,location:await c.ManualLayouts.write(e,s.layout)};if(s.op===`reset-manual-layout`)return{success:!0,location:await c.ManualLayouts.remove(e,t)};let{edits:p,modifiedRange:m}=this.convertToTextEdit({lookup:u,change:s});return p.length?await this.applyTextEdits(u.doc,p)?{success:!0,location:{uri:d.uri,range:m}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return ih.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}default:nonexhaustive(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,s=this.services.shared.workspace;if(!r){let r=qt.applyEdits(e.textDocument,t);return await s.FileSystemProvider.writeFile(e.uri,r),await s.DocumentBuilder.update([e.uri],[]),!0}let c=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return c.applied?(await s.DocumentBuilder.update([e.uri],[]),c.applied):(ih.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${c.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${c.failureReason}`),!1)}},LikeC4NameProvider=class extends An{services;constructor(e){super(),this.services=e}getNameStrict(e){return nonNullable(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(en(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(en(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return k(e,re(e=>`${e.type}.${e.name}`),be(),A(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends jn{constructor(e){super(e)}async computeExports(e,t){let r=[];try{let{specifications:t,models:s,views:c,globals:u,likec4lib:d,deployments:p}=e.parseResult.value;this.exportLibrary(d,r,e),this.exportSpecification(t,r,e),this.exportModel(s,r,e),this.exportViews(c,r,e),this.exportGlobals(u,r,e),this.exportDeployments(p,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let s=e?.flatMap(e=>e.views);if(!(N(s)||s.length===0))for(let e of s)try{x(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(N(e)||e.length===0)){for(let s of e.flatMap(e=>e.predicates))try{let e=s;x(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let s of e.flatMap(e=>e.styles))try{let e=s.id;x(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(N(e)||e.length===0))for(let s of e.flatMap(e=>e.elements))try{isElement(s)&&x(s.name)&&t.push(this.descriptions.createDescription(s,s.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!N(e))try{for(let s of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(s,s.name,r))}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(N(e)||e.length===0))for(let s of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(s):case isSpecificationElementKind(s):x(s.kind.name)&&t.push(this.descriptions.createDescription(s.kind,s.kind.name,r));continue;case isSpecificationTag(s):x(s.tag.name)&&t.push(this.descriptions.createDescription(s.tag,s.tag.name,r),this.descriptions.createDescription(s.tag,`#`+s.tag.name,r));continue;case isSpecificationRelationshipKind(s):x(s.kind.name)&&t.push(this.descriptions.createDescription(s.kind,s.kind.name,r),this.descriptions.createDescription(s.kind,`.`+s.kind.name,r));continue;case isSpecificationColor(s):x(s.name.name)&&t.push(this.descriptions.createDescription(s.name,s.name.name,r));continue;default:nonexhaustive(s)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let s=e?.flatMap(e=>e.elements);if(!(N(s)||s.length===0))for(let e of s)try{isDeploymentNode(e)&&x(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let r=e.parseResult.value,s=[],c=new Ht;for(let t of r.models)try{s.push(...this.processContainer(t,c,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{s.push(...this.processDeployments(t,c,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)s.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(s).forEach(e=>{c.add(r,e)}),t(c)})}processContainer(e,t,r){let s=new Ht,c=[];for(let u of e.elements){if(isRelation(u))continue;let e;if(isElement(u)?(x(u.name)&&s.add(u.name,this.descriptions.createDescription(u,u.name,r)),e=u.body,e&&(t.add(e,this.descriptions.createDescription(u,`this`,r)),t.add(e,this.descriptions.createDescription(u,`it`,r)))):isExtendElement(u)&&(e=u.body),e&&e.elements.length>0)try{c.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}c.length&&k(c,M(e=>!s.has(e.name)),re(e=>e.name),Fe((e,t)=>{e.length===1&&s.add(t,e[0])}));let u=[...s.values()];return t.addAll(e,u),u}processDeployments(e,t,r){let s=new Ht,c=[];for(let u of e.elements){if(isDeploymentRelation(u))continue;let e=u.body;if(!isExtendDeployment(u)){let c=this.nameProvider.getName(u);if(x(c)){let e=this.descriptions.createDescription(u,c,r);s.add(c,e)}e&&(t.add(e,this.descriptions.createDescription(u,`this`,r)),t.add(e,this.descriptions.createDescription(u,`it`,r)))}if(e)try{c.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}c.length&&k(c,M(e=>!s.has(e.name)),re(e=>e.name),Fe((e,t)=>{e.length===1&&s.add(t,e[0])}));let u=[...s.values()];return t.addAll(e,u),u}};const{getDocument:ah}=Ln;var LikeC4ScopeProvider=class extends sn{services;indexManager;constructor(e){super(e),this.services=e,this.indexManager=e.shared.workspace.IndexManager}get fqnIndex(){return this.services.likec4.FqnIndex}get deploymentsIndex(){return this.services.likec4.DeploymentsIndex}getScope(e){try{let t=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let s=e.container;if(isFqnRef(s))return new nn(this.streamForFqnRef(t,s,e));if(isStrictFqnRef(s))return this.getScopeForStrictFqnRef(t,s,e);if(r!==`Element`)return this.getProjectScope(t,r,e);if(isImported(s)){let e=projectIdFrom(s);return new nn(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(s)&&e.property===`el`){let c=s.parent;return c?new nn(this.fqnIndex.directChildrenOf(t,readStrictFqn(c))):this.getProjectScope(t,r,e)}return new nn(Nn(this.computeScope(t,e)))}catch(s){return logWarnError(s),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),Kt}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r);return}if(isDeploymentNode(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*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(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let s=t.parent;return s?new nn(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(s)).filter(e=>this.reflection.isSubtype(e.type,Rs))):this.getProjectScope(e,Rs,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let s=t.parent;if(!s)return Nn(this.genScopeForParentlessFqnRef(e,t,r));let c=s.value.ref;if(!c)return bn;if(isImported(c))return Nn(this.genUniqueDescedants(c.imported.ref));if(isDeploymentNode(c))return Nn(this.genUniqueDescedants(c));if(isDeployedInstance(c)){let e=c.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return Nn(this.genUniqueDescedants(t))}return isElement(c)?Nn(this.genUniqueDescedants(c)):nonexhaustive(c)}*genScopeForParentlessFqnRef(e,t,r){_n(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,ec):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,ec),yield*this.computeScope(e,r,Rs),yield*this.computeScope(e,r,Is)):(yield*this.computeScope(e,r,Rs),yield*this.computeScope(e,r,Is),_n(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,ec)));let s=ah(t).precomputedScopes;s&&(yield*s.values().filter(e=>this.reflection.isSubtype(e.type,Fc)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let s=this.reflection.isSubtype(r,ec),c=this.reflection.isSubtype(r,Vo),u=ah(t.container).precomputedScopes;if(!u){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),d=t.container;for(;d;){let e=u.get(d).filter(byReferenceType);e.length>0&&(yield*e),c&&isExtendDeploymentBody(d)&&(yield*this.genScopeExtendDeployment(d.$container)),s&&isExtendElementBody(d)&&(yield*this.genScopeExtendElement(d.$container)),s&&isElementViewBody(d)&&(yield*this.genScopeElementView(d.$container)),d=d.$container}yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===`LibIcon`?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new Gt(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}};let oh;(function(e){e.type=new bi(`likec4/onDidChangeModel`)})(oh||={});let sh;(function(e){e.type=new xi(`likec4/onDidChangeProjects`)})(sh||={});let ch;(function(e){e.type=new bi(e.Method=`likec4/onDidChangeSnapshot`)})(ch||={});let lh;(function(e){e.type=new bi(`likec4/onRequestOpenView`)})(lh||={});let uh;(function(e){e.req=new Si(`likec4/fetchComputedModel`)})(uh||={});let dh;(function(e){e.req=new Ci(`likec4/fetchViewsFromAllProjects`)})(dh||={});let fh;(function(e){e.req=new Si(`likec4/fetchLayoutedModel`)})(fh||={});let ph;(function(e){e.req=new Si(`likec4/layout-view`)})(ph||={});let mh;(function(e){e.req=new Si(`likec4/validate-layout`)})(mh||={});let hh;(function(e){e.req=new Ci(`likec4/reload-projects`)})(hh||={});let gh;(function(e){e.req=new Ci(`likec4/fetch-projects`)})(gh||={});let _h;(function(e){e.req=new Si(`likec4/register-project`)})(_h||={});let vh;(function(e){e.req=new Si(`likec4/build`)})(vh||={});let yh;(function(e){e.req=new Si(`likec4/locate`)})(yh||={});let bh;(function(e){e.req=new Si(`likec4/change-view`)})(bh||={});let xh;(function(e){e.req=new Ci(`likec4/metrics`)})(xh||={});let Sh;(function(e){e.req=new Si(`likec4/document-tags`)})(Sh||={});let Ch;(function(e){e.req=new Ci(`likec4/fetch-projects-overview`)})(Ch||={});const wh=Y.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=p(()=>{let e=this.services.shared.lsp.Connection;if(!e){wh.info(`no connection, skip init ServerRpc`);return}wh.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,s=r.LangiumDocuments,d=r.DocumentBuilder,sendDidChangeModelNotification=t=>{wh.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(oh.type,{projectId:t}).catch(e=>{wh.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},p=c(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),m=c(t=>{t>1?wh.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:wh.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(sh.type).catch(e=>{wh.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),g=!0;this.onDispose(er.create(()=>{p.cancel(),m.cancel()}),t.ModelBuilder.onModelParsed(e=>p.call(e)),r.ProjectsManager.onProjectsUpdate(()=>m.call(1)),e.onRequest(uh.req,async({projectId:e,cleanCaches:s=!1},c)=>{wh.debug`received request ${`fetchComputedModel`} for project ${e}`,s&&(wh.debug`cleanCaches: ${s}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let u=await t.ModelBuilder.computeModel(e,c);return u===za.EMPTY?{model:null}:{model:u.$data}}),e.onNotification(ch.type,async e=>{let t=fn.parse(e.update??e.delete),s=`update`in e?{update:t}:{delete:t};wh.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await r.ManualLayouts.handleFileSystemUpdate(s)}),e.onRequest(fh.req,async({projectId:e},r)=>{wh.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let s=await t.LanguageServices.layoutedModel(e);if(s===null)return{model:null};let c=await t.Views.diagrams(e,r);return{model:{...s.$data,_stage:`layouted`,views:b(c,e=>e.id)}}}),e.onRequest(ph.req,async({viewId:e,projectId:r,layoutType:s,hints:c},u)=>(wh.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${s??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:s,layoutHints:c,cancelToken:u})})),e.onRequest(mh.req,async({projectId:e},r)=>(wh.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(gh.req,async()=>(wh.debug`received request ${`FetchProjects`}`,{projects:h(s.groupedByProject(),(e,t)=>{let{folderUri:s,config:{name:c,title:u}}=r.ProjectsManager.getProject(t);return{folder:s.toString(),config:{name:c,title:u},docs:w(e,e=>e.uri.toString())}})})),e.onRequest(hh.req,async e=>{wh.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest(_h.req,async(e,t)=>{wh.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let s;return s=`configUri`in e?await r.ProjectsManager.registerConfigFile(fn.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:s.id}}),e.onRequest(dh.req,async e=>{wh.debug`received request ${`FetchViewsFromAllProjects`}`;let s=[];for(let c of r.ProjectsManager.all){await Xt(e);try{let r=await t.Views.computedViews(c,e);s.push(...k(r,w(e=>({id:e.id,title:e.title??e.id,projectId:c})),ye((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){wh.warn(`Failed to fetch views for project ${c}:`,{error:e})}}return{views:s}}),e.onRequest(vh.req,async({docs:t},r)=>{let c=t.map(e=>fn.parse(e)),isNotChanged=e=>!c.some(t=>pn.equals(t,e)),u=s.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();wh.debug(`[ServerRpc] received request to build:
122
+ changed (total ${c.length}):${t.map(e=>`
123
123
  - `+e).join(``)}
124
- deleted (total ${d.length}):${d.map(e=>`
124
+ deleted (total ${u.length}):${u.map(e=>`
125
125
  - `+e.toString()).join(`
126
- `)}`),!m&&u.length+d.length>0&&await Promise.allSettled([...u,...d].map(async t=>{let r=t.toString();$.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${r}: ${e}`)}})),m=!1,await Zt(r),await c.update(u,d,r)}),e.onRequest(tf.req,e=>{$.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r);default:nonexhaustive(e)}}),e.onRequest(nf.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(rf.req,async e=>{let s=null;for(let c of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(c,e);if(r===Ea.EMPTY)continue;s??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},s.elementKinds+=d(r.specification.elements).length,s.deploymentKinds+=d(r.specification.deployments).length,s.relationshipKinds+=d(r.specification.relationships).length,s.tags+=d(r.specification.tags).length,s.customColors+=d(r.specification.customColors??{}).length,s.elements+=d(r.$data.elements).length,s.deploymentNodes+=[...r.deployment.nodes()].length,s.relationships+=d(r.$data.relations).length,s.views+=d(r.$data.views).length,s.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${c}`,{err:e})}return await Zt(e),{metrics:s}}),e.onRequest(af.req,async({documentUri:e},s)=>{let c=R.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${c}`;let u=await t.ModelLocator.locateDocumentTags(c,s);return{projectId:r.ProjectsManager.ownerProjectId(c),tags:u??[]}}),e.onRequest(of.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));function reportLayoutDrift(e){return N(e,F(e=>!!e.hasLayoutDrift),D(e=>{let r=t.ModelLocator.locateView(e.id);return invariant(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:lu.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(Gd.type,e)}};$n();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=Bn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Is,Xs,ys,_s,gc):return En.Constructor;case hasType(kc,jc,Ac,sc,rl):return En.Namespace;case hasType(Bo):return En.Struct;case hasType(`Tag`,bc,ms,il):return En.EnumMember;case hasType(Gc,tl):return En.Event;case hasType(Rs,xs,$c,Qc):return En.TypeParameter}return En.Field}getCompletionItemKind(e){let t=Bn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ms):return Pn.Color;case hasType(Is,ys,_s,Xs,gc):return Pn.Constructor;case hasType(kc,jc,Ac,sc,rl):return Pn.Module;case hasType(Bo):return Pn.Class;case hasType(`Tag`,bc,ms,il):return Pn.EnumMember;case hasType(Gc,tl):return Pn.Event;case hasType(Rs,$c,xs,Qc):return Pn.TypeParameter;default:return Pn.Reference}}},WorkspaceSymbolProvider=class extends bn{};const sf=Y.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new L.default(e=>new ProjectStorage({projectId:e,storage:Br(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Vr(),this.onDispose(this.#e,_n.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{sf.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Fe((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let r=Fe(e.$data.views);if(r.length===0)return[];let s=e.project.id,c=sf.getChild(s),u=this.projectStorage(s),d=[],p=e.$styles,m=[];for(let e of r){let t={view:e,styles:p},r=await u.get(t);if(r){m.push(r);continue}d.push(t)}if(m.length>0&&(d.length>0?c.trace`cached ${m.length} views, need to layout ${d.length} views`:c.trace`cached all ${m.length} views`),d.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:d,cancelToken:t,onSuccess:(e,t)=>{m.push(u.remember(e,t))},onError:(e,t)=>{c.warn(`Fail layout view ${e.view.id}`,{error:t})}}),c.debug`layouted ${d.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Zt(t),m.length!==r.length&&c.warn`layouted ${m.length} of ${r.length} views`,m}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:s,layoutHints:c}){let u=await this.ModelBuilder.computeModel(r,s),d=u.findView(e)?.$view;r=u.project.id;let p=sf.getChild(r);if(c){invariant(d,`View ${e} not found in model`),p.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:d,styles:u.$styles},c);return{dot:t,diagram:r}}if(!d){p.warn`view ${e} not found in model`;let t=u.findManualLayout(e);if(t){p.info`found manual layout for ${e}`;let r={...t};return r.drifts=[`not-exists`],r._layout=`manual`,{diagram:r,dot:`# manual layout`}}return null}let m=this.projectStorage(r);try{let e={view:d,styles:u.$styles},r=await m.getOrExecute(e);return T(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,u,t)}:r}catch(e){let t=loggable(e);return p.warn(t),this.reportViewError(d,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,s=this.services.shared.workspace.Cache;if(s.has(r))return await Promise.resolve(s.get(r));let c=await this.ModelBuilder.computeModel(e,t),u=Fe(c.$data.views);if(u.length===0)return[];let d=u.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:c.$styles});return{id:e.id,dot:t,svg:r}}),p=[],m=await Promise.allSettled(d);for(let e of m)e.status===`fulfilled`?p.push(e.value):logWarnError(e.reason);return s.set(r,p),p}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){sf.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),s=computeAdhocView(r,e),{diagram:c}=await this.layouter.layout({view:{...s,hash:``,_type:`element`},styles:r.$styles});return sf.debug`layouting adhoc view... done`,c}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let s=t.findManualLayout(e.id);return s?r===`manual`?e._layout===`manual`?(sf.error`View ${e.id} already has manual layout, this should not happen`,e):applyManualLayout(e,s):calcDriftsFromSnapshot(e,s):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=sf.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let s=performanceMark(),c=await this.#n(e);return this.#e.trace(`layouted {view} in ${s.pretty}`,{view:e.view.id}),await this.#t.set(t,c),this.resetViewError(e.view),c}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:applyCachedLayout(e,t.diagram)}}const cf={graphviz(){return new xa}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Gt(e,Kt.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new Jl(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},workspace:{AstNodeDescriptionProvider:bind(AstNodeDescriptionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,s){let c=createSharedServices(e),u=an([Nn({shared:c}),zl,createLikeC4Module({...ou,...su,...cf,...e}),t,r,s].reduce(_merge,{}));return c.ServiceRegistry.register(u),registerValidationChecks(u),e.connection?onNextTick(()=>u.Rpc.init()):c.workspace.ConfigurationProvider.initialized({}),{shared:c,likec4:u}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...ou,...su,...e};return an(Xn(t),Rl,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,s]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||s===void 0)continue;let t=Object.hasOwn(e,r),c=e[r];t&&c!==null&&s!==null&&typeof c==`object`&&typeof s==`object`?e[r]=_merge(c,s):e[r]=s}return e}var lf={reset:[0,0],bold:[1,22,`\x1B[22m\x1B[1m`],dim:[2,22,`\x1B[22m\x1B[2m`],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39],bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]};function i(e){return String(e)}i.open=``,i.close=``;function B(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,s=e?.argv||[];return!(`NO_COLOR`in t||s.includes(`--no-color`))&&(`FORCE_COLOR`in t||s.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}function C({force:e}={}){let t=e||B(),a=(e,t,r,s)=>{let c=``,u=0;do c+=e.substring(u,s)+r,u=s+t.length,s=e.indexOf(t,u);while(~s);return c+e.substring(u)},l=(e,t,r=e)=>{let n=s=>{let c=String(s),u=c.indexOf(t,e.length);return~u?e+a(c,t,r,u)+t:e+c+t};return n.open=e,n.close=t,n},r={isColorSupported:t},f=e=>`\x1B[${e}m`;for(let e in lf){let s=lf[e];r[e]=t?l(f(s[0]),f(s[1]),s[2]):i}return r}var uf=C();const isErrorDiagnostic=e=>e.severity===1;var LikeC4=class{langium;logger;constructor(e,t=la){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
126
+ `)}`),!g&&c.length+u.length>0&&await Promise.allSettled([...c,...u].map(async t=>{let r=t.toString();wh.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){wh.warn(`error clearing diagnostics for ${r}: ${e}`)}})),g=!1,await Xt(r),await d.update(c,u,r)}),e.onRequest(yh.req,e=>{wh.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r);default:nonexhaustive(e)}}),e.onRequest(bh.req,async e=>(wh.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(xh.req,async e=>{let s=null;for(let c of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(c,e);if(r===za.EMPTY)continue;s??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},s.elementKinds+=u(r.specification.elements).length,s.deploymentKinds+=u(r.specification.deployments).length,s.relationshipKinds+=u(r.specification.relationships).length,s.tags+=u(r.specification.tags).length,s.customColors+=u(r.specification.customColors??{}).length,s.elements+=u(r.$data.elements).length,s.deploymentNodes+=[...r.deployment.nodes()].length,s.relationships+=u(r.$data.relations).length,s.views+=u(r.$data.views).length,s.projects+=1}catch(e){wh.warn(`Error fetching telemetry metrics for project ${c}`,{err:e})}return await Xt(e),{metrics:s}}),e.onRequest(Sh.req,async({documentUri:e},s)=>{let c=fn.parse(e);wh.debug`received request ${`GetDocumentTags`} for document ${c}`;let u=await t.ModelLocator.locateDocumentTags(c,s);return{projectId:r.ProjectsManager.ownerProjectId(c),tags:u??[]}}),e.onRequest(Ch.req,async e=>(wh.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));function reportLayoutDrift(e){return k(e,M(e=>!!e.hasLayoutDrift),w(e=>{let r=t.ModelLocator.locateView(e.id);return invariant(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:li.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){wh.warn(`No LSP connection`);return}await t.sendNotification(lh.type,e)}},NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=Fn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ec,mc,Rs,Is,Fc):return Hn.Constructor;case hasType(Jc,Xc,Yc,Ec,Sl):return Hn.Namespace;case hasType($o):return Hn.Struct;case hasType(`Tag`,zc,Ns,Cl):return Hn.EnumMember;case hasType(ul,bl):return Hn.Event;case hasType(nc,Bs,vl,_l):return Hn.TypeParameter}return Hn.Field}getCompletionItemKind(e){let t=Fn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Ns):return Ut.Color;case hasType(ec,Rs,Is,mc,Fc):return Ut.Constructor;case hasType(Jc,Xc,Yc,Ec,Sl):return Ut.Module;case hasType($o):return Ut.Class;case hasType(`Tag`,zc,Ns,Cl):return Ut.EnumMember;case hasType(ul,bl):return Ut.Event;case hasType(nc,vl,Bs,_l):return Ut.TypeParameter;default:return Ut.Reference}}},WorkspaceSymbolProvider=class extends xn{};const Th=Y.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new P.default(e=>new ProjectStorage({projectId:e,storage:Nr(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Pr(),this.onDispose(this.#e,er.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Th.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Be((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let r=Be(e.$data.views);if(r.length===0)return[];let s=e.project.id,c=Th.getChild(s),u=this.projectStorage(s),d=[],p=e.$styles,m=[];for(let e of r){let t={view:e,styles:p},r=await u.get(t);if(r){m.push(r);continue}d.push(t)}if(m.length>0&&(d.length>0?c.trace`cached ${m.length} views, need to layout ${d.length} views`:c.trace`cached all ${m.length} views`),d.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:d,cancelToken:t,onSuccess:(e,t)=>{m.push(u.remember(e,t))},onError:(e,t)=>{c.warn(`Fail layout view ${e.view.id}`,{error:t})}}),c.debug`layouted ${d.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Xt(t),m.length!==r.length&&c.warn`layouted ${m.length} of ${r.length} views`,m}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:s,layoutHints:c}){let u=await this.ModelBuilder.computeModel(r,s),d=u.findView(e)?.$view;r=u.project.id;let p=Th.getChild(r);if(c){invariant(d,`View ${e} not found in model`),p.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:d,styles:u.$styles},c);return{dot:t,diagram:r}}if(!d){p.warn`view ${e} not found in model`;let t=u.findManualLayout(e);if(t){p.info`found manual layout for ${e}`;let r={...t};return r.drifts=[`not-exists`],r._layout=`manual`,{diagram:r,dot:`# manual layout`}}return null}let m=this.projectStorage(r);try{let e={view:d,styles:u.$styles},r=await m.getOrExecute(e);return x(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,u,t)}:r}catch(e){let t=loggable(e);return p.warn(t),this.reportViewError(d,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,s=this.services.shared.workspace.Cache;if(s.has(r))return await Promise.resolve(s.get(r));let c=await this.ModelBuilder.computeModel(e,t),u=Be(c.$data.views);if(u.length===0)return[];let d=u.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:c.$styles});return{id:e.id,dot:t,svg:r}}),p=[],m=await Promise.allSettled(d);for(let e of m)e.status===`fulfilled`?p.push(e.value):logWarnError(e.reason);return s.set(r,p),p}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Th.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),s=computeAdhocView(r,e),{diagram:c}=await this.layouter.layout({view:{...s,hash:``,_type:`element`},styles:r.$styles});return Th.debug`layouting adhoc view... done`,c}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let s=t.findManualLayout(e.id);return s?r===`manual`?e._layout===`manual`?(Th.error`View ${e.id} already has manual layout, this should not happen`,e):applyManualLayout(e,s):calcDriftsFromSnapshot(e,s):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=Th.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let s=performanceMark(),c=await this.#n(e);return this.#e.trace(`layouted {view} in ${s.pretty}`,{view:e.view.id}),await this.#t.set(t,c),this.resetViewError(e.view),c}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:applyCachedLayout(e,t.diagram)}}const Eh={graphviz(){return new Pa}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new cn(e,rn.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new hu(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,s){let c=createSharedServices(e),u=$n([Mn({shared:c}),su,createLikeC4Module({...Tu,...Eu,...Eh,...e}),t,r,s].reduce(_merge,{}));return c.ServiceRegistry.register(u),registerValidationChecks(u),e.connection?onNextTick(()=>c.workspace.WorkspaceManager.ready.then(()=>u.Rpc.init())):c.workspace.ConfigurationProvider.initialized({}),{shared:c,likec4:u}}r(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...Tu,...Eu,...e};return $n(Yn(t),ou,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,s]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||s===void 0)continue;let t=Object.hasOwn(e,r),c=e[r];t&&c!==null&&s!==null&&typeof c==`object`&&typeof s==`object`?e[r]=_merge(c,s):e[r]=s}return e}var Dh={reset:[0,0],bold:[1,22,`\x1B[22m\x1B[1m`],dim:[2,22,`\x1B[22m\x1B[2m`],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39],bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]};function i(e){return String(e)}i.open=``,i.close=``;function B(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,s=e?.argv||[];return!(`NO_COLOR`in t||s.includes(`--no-color`))&&(`FORCE_COLOR`in t||s.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}function C({force:e}={}){let t=e||B(),a=(e,t,r,s)=>{let c=``,u=0;do c+=e.substring(u,s)+r,u=s+t.length,s=e.indexOf(t,u);while(~s);return c+e.substring(u)},l=(e,t,r=e)=>{let n=s=>{let c=String(s),u=c.indexOf(t,e.length);return~u?e+a(c,t,r,u)+t:e+c+t};return n.open=e,n.close=t,n},r={isColorSupported:t},f=e=>`\x1B[${e}m`;for(let e in Dh){let s=Dh[e];r[e]=t?l(f(s[0]),f(s[1]),s[2]):i}return r}var Oh=C();function parseWhere(e){if(S(e)){let t=e;switch(!0){case t.startsWith(`tag is not #`):return{tag:{neq:t.replace(`tag is not #`,``)}};case t.startsWith(`tag is #`):return{tag:{eq:t.replace(`tag is #`,``)}};case t.startsWith(`kind is not `):return{kind:{neq:t.replace(`kind is not `,``)}};case t.startsWith(`kind is `):return{kind:{eq:t.replace(`kind is `,``)}};case t.startsWith(`source.`):return{operator:parseWhere(t.replace(`source.`,``)),participant:`source`};case t.startsWith(`target.`):return{operator:parseWhere(t.replace(`target.`,``)),participant:`target`};default:throw Error(`Unknown where operator: ${e}`)}}if(e.and)return{and:w(e.and,parseWhere)};if(e.or)return{or:w(e.or,parseWhere)};if(e.not)return{not:parseWhere(e.not)};throw Error(`Unknown where operator: ${e}`)}function $include(...e){return t=>{if(e.length===2&&typeof e[1]!=`string`&&(`where`in e[1]||`with`in e[1])){let r=t.$expr(e[0]),s=e[1].where?parseWhere(e[1].where):void 0;s&&(r={where:{expr:r,condition:s}});let c=e[1].with;return c&&(r=q.is(r)?{custom:{...c,expr:r}}:{customRelation:{...c,expr:r}}),t.include(r),t}return t.include(...e.map(e=>t.$expr(e))),t}}function $exclude(...e){return t=>{let r=t.$expr(e[0]);if(e.length===2&&e[1].where){let t=parseWhere(e[1].where);r={where:{expr:r,condition:t}}}return t.exclude(r),t}}function $style(e,{notation:t,...r}){return s=>s.style({targets:(ze(e)?e:[e]).map(e=>s.$expr(e)),...t?{notation:t}:{},style:{...r}})}function $autoLayout(e,t){return r=>r.autoLayout(e,t)}function $rules(...e){return t=>e.reduce((e,t)=>t(e),t)}function $deploymentExpr(e){if(!S(e))return e;let asTypedDeploymentExpression=e=>e;if(e===`*`)return asTypedDeploymentExpression({wildcard:!0});if(e.startsWith(`->`))return e.endsWith(`->`)?asTypedDeploymentExpression({inout:$deploymentExpr(e.replace(/->/g,``).trim())}):asTypedDeploymentExpression({incoming:$deploymentExpr(e.replace(`-> `,``))});if(e.endsWith(` ->`))return asTypedDeploymentExpression({outgoing:$deploymentExpr(e.replace(` ->`,``))});if(e.includes(` <-> `)){let[t,r]=e.split(` <-> `);return asTypedDeploymentExpression({source:$deploymentExpr(t),target:$deploymentExpr(r),isBidirectional:!0})}if(e.includes(` -> `)){let[t,r]=e.split(` -> `);return asTypedDeploymentExpression({source:$deploymentExpr(t),target:$deploymentExpr(r)})}return e.endsWith(`._`)?asTypedDeploymentExpression({ref:{deployment:e.replace(`._`,``)},selector:`expanded`}):e.endsWith(`.**`)?asTypedDeploymentExpression({ref:{deployment:e.replace(`.**`,``)},selector:`descendants`}):e.endsWith(`.*`)?asTypedDeploymentExpression({ref:{deployment:e.replace(`.*`,``)},selector:`children`}):asTypedDeploymentExpression({ref:{deployment:e}})}function $includeAncestors(e){return t=>t.includeAncestors(e)}function $step(...e){let[t,r,s]=e;if(S(r)){let e;return s!=null&&(e=typeof s==`string`?{title:s}:{...s.title&&{title:s.title},...s.with}),s=>s.step({source:t,target:r,...e})}let[c,u]=t.split(` -> `),d=y(r)?{...r.title&&{title:r.title},...r.with}:{};return e=>e.step({source:c,target:u,...d})}function accumulateSteps(e){let t=[],r={step:e=>(t.push(e),r)};return Re(e,(e,t)=>{if(typeof t==`function`)return t(e);let[r,s]=t.split(` -> `);return e.step({source:r,target:s})},r),invariant(isNonEmptyArray(t),`At least one step is required`),t}$step.series=(...e)=>t=>{let[r,...s]=e,{steps:c}=Re(s,(e,t)=>{let r=t.substring(3);return e.steps.push({source:e.source,target:r,astPath:``}),e.source=r,e},{source:r,steps:[]});return invariant(isNonEmptyArray(c),`At least one step is required`),t.step({_type:`series`,steps:c})},$step.try=e=>t=>{let r={steps:accumulateSteps(e.try)},s=e.catch?{catch:{steps:accumulateSteps(e.catch)}}:void 0,c=e.finally?{finally:{steps:accumulateSteps(e.finally)}}:void 0;return t.step({_type:`try`,try:r,...s,...c})};function blockBuilder(e){return(...t)=>r=>{let s=accumulateSteps(t);return r.step({_type:e,steps:s})}}$step.parallel=blockBuilder(`par`),$step.loop=blockBuilder(`loop`),$step.opt=blockBuilder(`opt`),$step.break=blockBuilder(`break`),$step.alt=(...e)=>t=>{let r=[],s={Types:{},addBranch:e=>(r.push(e),s)};return e.forEach(e=>{e(s)}),invariant(isNonEmptyArray(r),`At least one branch is required`),t.step({_type:`alt`,branches:r})};function branchBuilder(e){return(...t)=>r=>{let s=accumulateSteps(t);return r.addBranch({_type:e,steps:s})}}$step.when=branchBuilder(`when`),$step.if=branchBuilder(`if`),$step.else=branchBuilder(`else`);function mkViewBuilder(e){let t={$expr:e._type===`deployment`?$deploymentExpr:$expr,autoLayout(t,r){return e.rules.push(exact({direction:t,rankSep:r?.rank,nodeSep:r?.node})),this},include(...t){return e.rules.push({include:t}),this},style(t){return e.rules.push(t),this},get Expr(){throw Error(`Expr is not available in runtime`)},get Types(){throw Error(`Types are not available in runtime`)},get ElementExpr(){throw Error(`ElementExpr is not available in runtime`)},get TypedExpr(){throw Error(`TypedExpr is not available in runtime`)}};return e._type===`element`?Object.assign(t,{exclude(...t){return e.rules.push({exclude:t}),this}}):e._type===`deployment`?Object.assign(t,{exclude(...t){return e.rules.push({exclude:t}),this},includeAncestors(t){return e.rules.push({includeAncestors:t}),this}}):e._type===`dynamic`?Object.assign(t,{step(t){return e.steps.push(t),this}}):t}function ensureObj(e){return ze(e)?xe(e,e=>({})):e}function validateSpec({tags:e,elements:t,deployments:r,relationships:s,...c}){let u={};e&&Object.assign(u,ensureObj(e));let d=ensureObj(t??{});for(let[e,t]of be(d))if(t.tags)for(let r of t.tags)invariant(r in u,`Invalid specification for element kind "${e}": tag "${r}" not found`);let p=ensureObj(r??{});for(let[e,t]of be(p))if(t.tags)for(let r of t.tags)invariant(r in u,`Invalid specification for deployment kind "${e}": tag "${r}" not found`);return{...c,tags:u,elements:d,deployments:p,relationships:ensureObj(s??{})}}const specKeysOf=e=>N(e)?[]:ze(e)?e:Object.keys(e);function assertSpecificationCompatible(e,t){let r=[],compare=(e,t,s)=>{for(let c of t)s.has(c)||r.push(`${e} "${c}"`)};if(compare(`element kind`,specKeysOf(e.elements),new Set(specKeysOf(t.elements))),compare(`deployment kind`,specKeysOf(e.deployments),new Set(specKeysOf(t.deployments))),compare(`relationship kind`,specKeysOf(e.relationships),new Set(specKeysOf(t.relationships))),compare(`tag`,specKeysOf(e.tags),new Set(specKeysOf(t.tags))),compare(`metadata key`,e.metadataKeys??[],new Set(t.metadataKeys??[])),r.length>0)throw Error(`Specification mismatch — declared but not present in the loaded model:\n - ${r.join(`
127
+ - `)}`)}function toMarkdownOrString(e){return N(e)?null:typeof e==`string`?{txt:e}:e}function builder(e,t=new Map,r=[],s=new Map,c={predicates:{},dynamicPredicates:{},styles:{}},u=new Map,d=[],p=new P.default(()=>new Map),g=`editable`){let _=validateSpec(e),toLikeC4Specification=()=>({elements:structuredClone(_.elements),deployments:structuredClone(_.deployments),relationships:structuredClone(_.relationships),tags:assignTagColors(structuredClone(_.tags)),..._.metadataKeys?{metadataKeys:_.metadataKeys}:{},customColors:{}}),mapLinks=e=>{if(!(!e||!j(e,1)))return w(e,e=>typeof e==`string`?{url:e}:e)},createGenericView=(e,t,r)=>{v(t)&&(r=t,t={}),t??={};let{links:s=[],title:c=null,description:u=null,tags:d=[],...p}=typeof t==`string`?{title:t}:{...t},m=mapLinks(s);return[exact({id:e,title:c,description:toMarkdownOrString(u),tags:d,links:m,_stage:`parsed`,...p}),r]},checkElementExists=e=>{let[r,s]=splitGlobalFqn(e),c=(r?p.get(r):t).get(s);return invariant(c,`Element with id "${e}" not found`),c},parseRelEndpoint=e=>{if(typeof e==`string`){let[t,r]=splitGlobalFqn(e);return t?{project:t,model:r}:{model:r}}return`project`in e||`deployment`in e?e:parseRelEndpoint(e.model)},y={get Types(){throw Error(`Types are not available in runtime`)},specification:e=>{let m=Qi(validateSpec(e),_),h=new P.default(()=>new Map);for(let[e,t]of p)h.set(e,structuredClone(t));return builder(m,structuredClone(t),structuredClone(r),structuredClone(s),structuredClone(c),structuredClone(u),structuredClone(d),h,g)},clone:()=>{let e=new P.default(()=>new Map);for(let[t,r]of p)e.set(t,structuredClone(r));return builder(structuredClone(_),structuredClone(t),structuredClone(r),structuredClone(s),structuredClone(c),structuredClone(u),structuredClone(d),e,g)},__addElement:e=>{let[r,s]=splitGlobalFqn(e.id),c=parentFqn(s),u=r?p.get(r):t;c&&invariant(u.get(c),`Parent element with id "${c}" not found for element with id "${e.id}"`);let d=u.get(s);if(d){if(g===`strict`)throw Error(`Element with id "${e.id}" already exists`);invariant(d.kind===e.kind,`Element with id "${e.id}" already exists with kind "${d.kind}", cannot redeclare as "${e.kind}"`)}return u.set(s,r?{...e,id:s}:e),y},__addRelation(e){let t=parseRelEndpoint(e.source),s=G.flatten(t),c=parseRelEndpoint(e.target),u=G.flatten(c),d=checkElementExists(s),p=checkElementExists(u);if(isGlobalFqn(s)&&isGlobalFqn(u))throw Error(`Cannot create relationship between global elements`);return!isGlobalFqn(s)&&!isGlobalFqn(u)&&invariant(!isSameHierarchy(d,p),`Cannot create relationship between elements in the same hierarchy`),r.push({id:`rel${r.length+1}`,...e,source:t,target:c}),y},__fqn(e){return invariant(e.trim()!==``,`Id must be non-empty`),e},__deploymentFqn(e){return invariant(e.trim()!==``,`Id must be non-empty`),e},__addSourcelessRelation(){throw Error(`Can be called only in nested model`)},__addView:e=>{if(s.has(e.id))throw Error(`View with id "${e.id}" already exists`);return isElementView$1(e)&&`viewOf`in e&&invariant(t.get(e.viewOf),`Invalid scoped view ${e.id}, wlement with id "${e.viewOf}" not found`),s.set(e.id,e),y},__addDeployment:e=>{if(u.has(e.id))throw Error(`Deployment with id "${e.id}" already exists`);let r=parentFqn(e.id);return r&&invariant(u.get(r),`Parent element with id "${r}" not found for node with id "${e.id}"`),isDeployedInstance$1(e)&&(invariant(r,`Instance ${e.id} of ${e.element} must be deployed under a parent node`),invariant(t.get(e.element),`Instance "${e.id}" references non-existing element "${e.element}"`)),u.set(e.id,e),y},__addDeploymentRelation:e=>(invariant(!isSameHierarchy(e.source.deployment,e.target.deployment),`Cannot create relationship between elements in the same hierarchy`),invariant(u.has(e.source.deployment),`Relation "${e.source.deployment} -> ${e.target.deployment}" references non-existing source`),invariant(u.has(e.target.deployment),`Relation "${e.source.deployment} -> ${e.target.deployment}" references non-existing target`),d.push({id:`deploy_rel${d.length+1}`,...e}),y),build:e=>({[Wi]:`parsed`,projectId:typeof e==`string`?e:e?.id??`from-builder`,project:{id:typeof e==`string`?e:`from-builder`,...typeof e==`object`&&e?e:{}},specification:toLikeC4Specification(),elements:Ge(structuredClone(Array.from(t.entries()))),relations:m(r,e=>[e.id,structuredClone(e)]),globals:structuredClone(c),deployments:{elements:Ge(structuredClone(Array.from(u.entries()))),relations:m(d,e=>[e.id,structuredClone(e)])},views:Ge(structuredClone(Array.from(s.entries()))),imports:k(Array.from(p.entries()),w(([e,t])=>[e,structuredClone([...t.values()])]),M(([e,t])=>t.length>0),Ge())}),toLikeC4Model:e=>computeLikeC4Model(y.build(e)),helpers:()=>({model:{model:(...e)=>t=>e.reduce((e,t)=>t(e),t),rel:(e,t,r)=>s=>{let{title:c=``,links:u=[],description:d=null,notes:p=null,...m}=Qi(typeof r==`string`?{title:r}:{...r},{title:null,links:null}),h=mapLinks(u);return s.__addRelation(exact({source:{model:e},target:{model:t},title:c,...d&&{description:toMarkdownOrString(d)},...p&&{notes:toMarkdownOrString(p)},links:h,...m})),s},relTo:(e,t)=>r=>{let{title:s=``,links:c,description:u=null,notes:d=null,...p}=Qi(typeof t==`string`?{title:t}:{...t},{title:null,links:null});return r.__addSourcelessRelation(exact({target:{model:e},title:s,...u&&{description:toMarkdownOrString(u)},...d&&{notes:toMarkdownOrString(d)},links:mapLinks(c),...p})),r},...h(_.elements,({style:e,...t},r)=>(s,c)=>{let add=(u=>{let{links:d,icon:p,color:m,shape:h,style:g,title:_,description:v,summary:y,...b}=typeof c==`string`?{title:c}:{...c},ee=p??e?.icon,te=mapLinks(d),x=u.__fqn(s);return u.__addElement(exact({id:x,kind:r,...t,title:_??t.title??nameFromFqn(x),...v&&{description:toMarkdownOrString(v)},...y&&{summary:toMarkdownOrString(y)},style:exact({icon:ee,color:m??e?.color,shape:h??e?.shape,border:e?.border,opacity:e?.opacity,size:e?.size,padding:e?.padding,textSize:e?.textSize,...g}),...te&&{links:te},...b})),u});return add.with=(...e)=>t=>{add(t);let{__fqn:r,__addSourcelessRelation:c}=t;try{t.__fqn=e=>`${r(s)}.${e}`,t.__addSourcelessRelation=e=>t.__addRelation({...e,source:{model:r(s)}}),e.reduce((e,t)=>t(e),t)}finally{t.__fqn=r,t.__addSourcelessRelation=c}return t},add})},views:{views:(...e)=>t=>e.reduce((e,t)=>t(e),t),view:(e,t,r)=>{let[s,c]=createGenericView(e,t,r),u={...s,[Gi]:`element`,rules:[]},add=e=>(e.__addView(u),c&&c(mkViewBuilder(u)),e);return add.with=(...e)=>t=>{add(t);let r=mkViewBuilder(u);for(let t of e)t(r);return t},add},viewOf:(e,t,r,s)=>{let[c,u]=createGenericView(e,r,s),d={...c,viewOf:t,[Gi]:`element`,rules:[]},add=e=>(e.__addView(d),u&&u(mkViewBuilder(d)),e);return add.with=(...e)=>t=>{add(t);let r=mkViewBuilder(d);for(let t of e)t(r);return t},add},deploymentView:(e,t,r)=>{let[s,c]=createGenericView(e,t,r),u={...s,[Gi]:`deployment`,rules:[]},add=e=>(e.__addView(u),c&&c(mkViewBuilder(u)),e);return add.with=(...e)=>t=>{add(t);let r=mkViewBuilder(u);for(let t of e)t(r);return t},add},dynamicView:(e,t,r)=>{let[s,c]=createGenericView(e,t,r),u={...s,[Gi]:`dynamic`,rules:[],steps:[]},add=e=>(e.__addView(u),c&&c(mkViewBuilder(u)),e);return add.with=(...e)=>t=>{add(t);let r=mkViewBuilder(u);for(let t of e)t(r);return t},add},$autoLayout,$exclude,$include,$rules,$style,$step,$includeAncestors},deployment:{deployment:(...e)=>t=>e.reduce((e,t)=>t(e),t),instanceOf:(e,t,r)=>s=>{N(t)?(t=e,e=nameFromFqn(e)):typeof t==`string`?r??={}:(r=t,t=e,e=nameFromFqn(e));let{links:c,title:u,description:d,summary:p,icon:m,color:h,shape:g,style:_,...v}=typeof r==`string`?{title:r}:{...r},y=s.__deploymentFqn(e);return s.__addDeployment(exact({id:y,element:t,...u&&{title:u},...p&&{summary:toMarkdownOrString(p)},...d&&{description:toMarkdownOrString(d)},style:exact({icon:m,color:h,shape:g,..._}),links:mapLinks(c),...v})),s},rel:(e,t,r)=>s=>{let{title:c=null,links:u,description:d=null,notes:p=null,...m}=typeof r==`string`?{title:r}:{...r};return s.__addDeploymentRelation(exact({source:{deployment:e},target:{deployment:t},title:c,...d&&{description:toMarkdownOrString(d)},...p&&{notes:toMarkdownOrString(p)},links:mapLinks(u),...m})),s},...h(_.deployments??{},({style:e,...t},r)=>(s,c)=>{let add=(u=>{let{links:d,icon:p,style:m,title:h,description:g,summary:_,color:v,shape:y,...b}=typeof c==`string`?{title:c}:{...c},ee=p??e?.icon,te=mapLinks(d),x=u.__deploymentFqn(s);return u.__addDeployment(exact({id:x,kind:r,...t,title:h??t.title??nameFromFqn(x),...g&&{description:toMarkdownOrString(g)},..._&&{summary:toMarkdownOrString(_)},style:exact({icon:ee,color:v??e?.color,shape:y??e?.shape,border:e?.border,opacity:e?.opacity,size:e?.size,padding:e?.padding,textSize:e?.textSize,...m}),...te&&{links:te},...b})),u});return add.with=(...e)=>t=>{add(t);let{__deploymentFqn:r}=t;try{t.__deploymentFqn=e=>`${r(s)}.${e}`,e.reduce((e,t)=>t(e),t)}finally{t.__deploymentFqn=r}return t},add})}}),with:(...e)=>{let t=y.clone();return e.reduce((e,t)=>t(e),t)},model:e=>{let t=y.clone(),r=t.helpers().model,s=r.model;return e({...r,_:s},s)(t)},deployment:e=>{let t=y.clone(),r=t.helpers().deployment,s=r.deployment;return e({...r,_:s},s)(t)},views:e=>{let t=y.clone(),r=t.helpers().views;return e({...r,_:r.views},r.views)(t)}};return y}function fromParsedImpl(e,t=`editable`){let{specification:r}=e,s={elements:r.elements,deployments:r.deployments,relationships:r.relationships,tags:r.tags,metadataKeys:r.metadataKeys},c=new Map(Object.entries(structuredClone(e.elements))),u=Object.values(structuredClone(e.relations)),d=new Map(Object.entries(structuredClone(e.views))),p=structuredClone(e.globals),m=new Map(Object.entries(structuredClone(e.deployments.elements))),h=Object.values(structuredClone(e.deployments.relations)),g=new P.default(()=>new Map);for(let[t,r]of Object.entries(e.imports??{})){let e=structuredClone(r);g.set(t,new Map(e.map(e=>[e.id,e])))}return builder(s,c,u,d,p,m,h,g,t)}const kh={forSpecification(e){let t=builder(e);return{...t.helpers(),builder:t}},specification(e){return builder(e)},fromParsed:fromParsedImpl},isErrorDiagnostic=e=>e.severity===1;var LikeC4=class{langium;logger;constructor(e,t=xa){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
127
128
  ${e.map(e=>` - ${e.folder.fsPath}`).join(`
128
129
  `)}
129
130
 
130
- Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}projects(){return D(this.languageServices.projects(),M(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(isErrorDiagnostic)??[]).map(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(isErrorDiagnostic))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(isErrorDiagnostic)??[];if(!P(r,1))continue;e=!0;let s=N(r,I(e=>{let t=e.range.start.line,r=e.message.split(`
131
- `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+uf.dim(`Line ${t}: `)+uf.red(e):` `.repeat(10)+uf.red(e))}),we(`
132
- `));this.logger.error(`Invalid ${t.uri.fsPath}\n${s}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},s={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(s)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const df={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
133
- `)}`);async function handleInitOptions(e,t=la,r){let s=new LikeC4(e,t),c=r?.throwIfInvalid??df.throwIfInvalid,u=r?.printErrors??df.printErrors;if((c||u)&&s.hasErrors()){if(c)return await s.dispose(),Promise.reject(validationErrorsToError(s));s.printErrors()}return s}function configureLogger(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`){configureLanguageServerLogger({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}configureLanguageServerLogger({colors:mi,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=la.getChild(`lang`),r=Ki(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),s=r.graphviz===`binary`;return t.info(`${uf.dim(`layout`)} ${s?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?tu:su}:{...ou,...su},...WithGraphviz(s?new GraphvizBinaryAdapter:new xa)})}async function fromWorkspace(e,t){let r=ai(e),s=Lr(R.file(r).toString()),c=la.getChild(`lang`),u=Ki(t,{...df,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(u);let d=createLanguageServices(u),p={name:ni(r),uri:s},m=d.shared.workspace.WorkspaceManager;c.info(`${uf.dim(`workspace:`)} ${r}`),m.initialize({capabilities:{},processId:null,rootUri:p.uri,workspaceFolders:[p]}),await m.initialized({});let h=d.shared.workspace.LangiumDocuments.userDocuments.toArray();if(h.length===0&&(c.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await d.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return c.info(`${uf.dim(`workspace:`)} found ${h.length} source files`),handleInitOptions(d,la,t)}function createContext(e={}){let t,r=!1,checkConflict=e=>{if(t&&t!==e)throw Error(`Context conflict`)},s;if(e.asyncContext){let t=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;t?s=new t:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}let _getCurrentInstance=()=>{if(s){let e=s.getStore();if(e!==void 0)return e}return t};return{use:()=>{let e=_getCurrentInstance();if(e===void 0)throw Error(`Context is not available`);return e},tryUse:()=>_getCurrentInstance(),set:(e,s)=>{s||checkConflict(e),t=e,r=!0},unset:()=>{t=void 0,r=!1},call:(e,c)=>{checkConflict(e),t=e;try{return s?s.run(e,c):c()}finally{r||(t=void 0)}},async callAsync(e,c){t=e;let onRestore=()=>{t=e},onLeave=()=>t===e?onRestore:void 0;hf.add(onLeave);try{let u=s?s.run(e,c):c();return r||(t=void 0),await u}finally{hf.delete(onLeave)}}}}function createNamespace(e={}){let t={};return{get(r,s={}){return t[r]||(t[r]=createContext({...e,...s})),t[r]}}}const ff=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof global<`u`?global:typeof window<`u`?window:{},pf=`__unctx__`;ff[pf]||(ff[pf]=createNamespace());const mf=`__unctx_async_handlers__`,hf=ff[mf]||(ff[mf]=new Set),gf=createContext(),_f=createContext();function useLanguageServices(){return _f.use()}function setMcpServerCtx(e){return e?gf.set(e,!0):gf.unset(),e}function setLanguageServicesCtx(e){return e?_f.set(e,!0):_f.unset(),e}const vf=la.getChild(`mcp`);function likec4Tool(e){return t=>r=>{let{name:s,description:c,...u}=e,d={description:c?.trim()??``,...u};return r.registerTool(s,d,async(...e)=>{let r=useLanguageServices();vf.debug(`Calling tool {name}, args: {args}`,{name:s,args:e});try{let s=await t.apply(null,[r,...e]);return typeof s==`string`?{content:[{type:`text`,text:s}]}:y(d.outputSchema)?hasProp(s,`content`)?s:{content:[{type:`text`,text:JSON.stringify(s)}]}:{content:[],structuredContent:s}}catch(e){return vf.error(`Tool ${s} failed`,{err:e}),{content:[{type:`text`,text:loggable(e)}],isError:!0}}}),r}}var yf=`1.58.0`;function applySemanticLayoutPrompt(e){let t=useLanguageServices();return e.registerPrompt(`apply_semantic_layout`,{title:`Prepare prompt for applying semantic layout to a likec4 view`,argsSchema:{projectId:Xr(V().describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(M(`id`))),viewId:Xr(V().describe(`View ID`),async(r=``,s)=>{let c=s?.arguments?.projectId??t.projectsManager.default.id,u=await t.computedModel(c);return u?Array.from(u.views()).filter(e=>e.id.startsWith(r)).map(M(`id`)):(await e.sendLoggingMessage({level:`warning`,data:`Completing viewId for project ${c} with input value "${r}", model not found`}),[])})}},async({viewId:e,projectId:t},r)=>({messages:[{role:`user`,content:{type:`text`,text:["Call `apply-semantic-layout` tool from `likec4` MCP with these arguments:","projectId: `"+t+"`","viewId: `"+e+"`"].join(`
134
- `)}}]})),e}function projectResource(e){let t=useLanguageServices();return e.registerResource(`likec4-project`,new qr(`likec4://project/{projectId}`,{list:async()=>({resources:t.projects().map(e=>({uri:`likec4://project/${encodeURIComponent(e.id)}`,name:e.title}))}),complete:{projectId:e=>{if(!e)return t.projects().map(M(`id`));let r=e.toLowerCase();return t.projects().filter(e=>e.id.toLowerCase().includes(r)).map(M(`id`))}}}),{description:`LikeC4 project resource`,mimeType:`application/json`},async(e,{projectId:r})=>{if(!r)return{contents:[]};let s=typeof r==`string`?[r]:r;return{contents:t.projects().filter(e=>s.includes(e.id)).map(e=>({uri:`likec4://project/${encodeURIComponent(e.id)}`,text:JSON.stringify({id:e.id,title:e.title,folder:e.folder.fsPath})}))}}),e}const bf=createLogger(`ai-layout`);function truncate(e,t=100){return e=e.replaceAll(/\n/g,` `).trim(),e.length<=t?e:e.slice(0,t-1)+`…`}function mappedEntries(e){let t={};for(let[r,s]of e.entries())t[s]=r;return t}function edgeLabel(e){let t=e.label&&e.label!==`[...]`?e.label:void 0,r=flattenMarkdownOrString(e.description);return r&&(t=t?`${t}\n${r}`:r),t??=e.technology??void 0,t?truncate(t):void 0}function prepareLLMInput(e){let t=1,r=1,s=new L.default(e=>e.children.length===0?`n${r++}`:`c${t++}`),findNodeById=t=>e.nodes.find(e=>e.id===t),nodeId=e=>s.get(findNodeById(e)),c=new Set;e.nodes.forEach(e=>{s.get(e),e.children.length===0&&c.add(e.id)});let u=e.edges.find(e=>!c.has(e.source)||!c.has(e.target));if(u)throw bf.error(`Non-leaf edge found in view`,{view:e.id,edge:{source:u.source,target:u.target}}),Error(`Non-leaf edge found in view, this is not supported by the current implementation`);let d=1,p=new L.default(e=>`e${d++}`),m=e.edges.map(e=>{let t=nodeId(e.source),r=nodeId(e.target),s=e.parent?nodeId(e.parent):null;e.dir===`back`&&([t,r]=[r,t]);let c=edgeLabel(e);return{id:p.get(e),...c&&{label:c},...s&&{parent:s},source:t,target:r}}),reduceNodes=(e,t)=>{let{level:r,kind:c,...u}=t,d=s.get(t),p=u.children.length>0,m=u.parent?nodeId(u.parent):void 0,h=truncate(u.title);if(p)return e.compounds.push(exact({id:d,title:h,parent:m,children:u.children.map(nodeId),level:r})),e;let g=u.description?truncate(flattenMarkdownOrString(u.description),200):void 0;return e.nodes.push(exact({id:d,kind:c,title:h,description:g,parent:m,level:r})),e};return{serialized:e.nodes.reduce(reduceNodes,{direction:e.autoLayout.direction,compounds:[],nodes:[],edges:m}),mapping:{nodes:mappedEntries(s),edges:mappedEntries(p)}}}const xf=sr([`TB`,`BT`,`LR`,`RL`]),Sf=ur().nonempty().brand(),Cf=lr({rank:sr([`same`,`source`,`sink`,`min`,`max`]),nodes:or(Sf)}),wf={id:ur().nonempty().brand(),weight:cr().int().min(0).max(20),minlen:cr().int().min(0).max(4)},Tf=lr({source:Sf,target:Sf,weight:wf.weight.optional(),minlen:wf.minlen.optional()}),Ef=lr({direction:xf.optional(),ranks:or(Cf).default([]),edgeWeight:gr(wf.id,wf.weight).default({}),edgeMinlen:gr(wf.id,wf.minlen).default({}),reverseRank:or(wf.id).default([]),excludeFromRanking:or(wf.id).default([]),edgeOrder:or(wf.id).default([]),nodeOrder:or(Sf).default([]),invisibleEdges:or(Tf).default([]),reasoning:ur().default(``)}),Df=/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/;function extractJson(e){let t=Df.exec(e);if(t&&t[1])return t[1];let r=e.indexOf(`{`),s=e.lastIndexOf(`}`);return r!==-1&&s!==-1&&s>r?e.slice(r,s+1):e.trim()}function parseOutput(e,t){try{let r=extractJson(e),s=Fa.default.parse(r),c=Ef.safeParse(s);if(!c.success){bf.warn(`Failed to validate LLM response
135
- `+Cr(c.error));return}return restoreIdsAndMapToHints(c.data,t)}catch(t){bf.warn(`Failed to parse LLM response
136
- {response}`,{error:t,response:e});return}}function restoreIdsAndMapToHints(e,t){let{mapping:r}=t,nodeId=e=>{let t=r.nodes[e]?.id;return t||bf.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>N(e,D(nodeId),F(ie)),edgeId=e=>{let t=r.edges[e]?.id;return t||bf.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let r=e.map(t).filter(ie);return P(r,1)?r:void 0},s=N(e.excludeFromRanking,D(edgeId),F(ie),le(),e=>P(e,1)?e:void 0),c=N(e.reverseRank,D(edgeId),F(ie),le(),e=>P(e,1)?e:void 0),u=(()=>{let e=new Set;return t=>t.filter(t=>e.has(t)?!1:(e.add(t),!0))})(),d=N(e.ranks,D(e=>{let t=u(mapToNodeId(e.nodes));return P(t,1)?{rank:e.rank,nodes:t}:null}),F(T)),p=N(e.invisibleEdges,D(({source:e,target:t,minlen:r=1,weight:s=1})=>{let c=nodeId(e),u=nodeId(t);if(!(!c||!u))return exact({weight:s===1?void 0:s,minlen:r===1?void 0:r,source:c,target:u})}),F(ie),se(e=>`${e.source}->${e.target}`),g(([e,...t])=>N(t,Me((e,t)=>exact({...e,...t,weight:e.weight&&t.weight?Math.max(e.weight,t.weight):e.weight||t.weight,minlen:e.minlen&&t.minlen?Math.max(e.minlen,t.minlen):e.minlen||t.minlen}),e))),Fe(),e=>P(e,1)?e:void 0),m=e.reasoning;m&&(m=m.replaceAll(`][`,`] [`),Re(t.mapping.nodes).forEach(([e,t])=>{m=m.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.id+"`")}),Re(t.mapping.edges).forEach(([e,t])=>{m=m.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.source+` -> `+t.target+"`")}));let safeMapEdgeKeys=e=>{let t={};for(let[r,s]of Re(e)){let e=edgeId(r);e&&(t[e]=s)}return t};return exact({direction:e.direction,ranks:d,edgeWeight:safeMapEdgeKeys(e.edgeWeight),edgeMinlen:safeMapEdgeKeys(e.edgeMinlen),excludeFromRanking:s,reverseRank:c,edgeOrder:mapToNonEmpty(e.edgeOrder,edgeId),nodeOrder:mapToNonEmpty(e.nodeOrder,nodeId),invisibleEdges:p,reasoning:m})}const Of={systemPrompt:`You are an advisor specializing in software architecture diagrams and graphviz (DOT) layout optimizations.
131
+ Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}async parsedModel(e){let t=this.projectsManager.ensureProjectId(e),r=await this.modelBuilder.parseModel(t);if(!r)throw Error(`Failed to parse model for project "${t}"`);return r}async toBuilder(e=`editable`,t){let r=await this.parsedModel(t);return kh.fromParsed(r.$data,e)}async toTypedBuilder(e){let{specification:t,mode:r=`editable`,project:s}=e,c=await this.parsedModel(s);return assertSpecificationCompatible(t,c.$data.specification),kh.fromParsed(c.$data,r)}async toDSL(e){return generateLikeC4((await this.parsedModel(e)).$data)}projects(){return w(this.languageServices.projects(),D(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(isErrorDiagnostic)??[]).map(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(isErrorDiagnostic))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(isErrorDiagnostic)??[];if(!j(r,1))continue;e=!0;let s=k(r,A(e=>{let t=e.range.start.line,r=e.message.split(`
132
+ `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+Oh.dim(`Line ${t}: `)+Oh.red(e):` `.repeat(10)+Oh.red(e))}),Oe(`
133
+ `));this.logger.error(`Invalid ${t.uri.fsPath}\n${s}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},s={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(s)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Ah={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
134
+ `)}`);async function handleInitOptions(e,t=xa,r){let s=new LikeC4(e,t),c=r?.throwIfInvalid??Ah.throwIfInvalid,u=r?.printErrors??Ah.printErrors;if((c||u)&&s.hasErrors()){if(c)return await s.dispose(),Promise.reject(validationErrorsToError(s));s.printErrors()}return s}function configureLogger(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`){configureLanguageServerLogger({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}configureLanguageServerLogger({colors:fi,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=xa.getChild(`lang`),r=Qi(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),s=r.graphviz===`binary`;return t.info(`${Oh.dim(`layout`)} ${s?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?yu:Eu}:{...Tu,...Eu},...WithGraphviz(s?new GraphvizBinaryAdapter:new Pa)})}async function fromWorkspace(e,t){let r=Qr(e),s=Dr(fn.file(r).toString()),c=xa.getChild(`lang`),u=Qi(t,{...Ah,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(u);let d=createLanguageServices(u),p={name:Yr(r),uri:s},m=d.shared.workspace.WorkspaceManager;c.info(`${Oh.dim(`workspace:`)} ${r}`),m.initialize({capabilities:{},processId:null,rootUri:p.uri,workspaceFolders:[p]}),await m.initialized({});let h=d.shared.workspace.LangiumDocuments.userDocuments.toArray();if(h.length===0&&(c.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await d.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return c.info(`${Oh.dim(`workspace:`)} found ${h.length} source files`),handleInitOptions(d,xa,t)}function createContext(e={}){let t,r=!1,checkConflict=e=>{if(t&&t!==e)throw Error(`Context conflict`)},s;if(e.asyncContext){let t=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;t?s=new t:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}let _getCurrentInstance=()=>{if(s){let e=s.getStore();if(e!==void 0)return e}return t};return{use:()=>{let e=_getCurrentInstance();if(e===void 0)throw Error(`Context is not available`);return e},tryUse:()=>_getCurrentInstance(),set:(e,s)=>{s||checkConflict(e),t=e,r=!0},unset:()=>{t=void 0,r=!1},call:(e,c)=>{checkConflict(e),t=e;try{return s?s.run(e,c):c()}finally{r||(t=void 0)}},async callAsync(e,c){t=e;let onRestore=()=>{t=e},onLeave=()=>t===e?onRestore:void 0;Ph.add(onLeave);try{let u=s?s.run(e,c):c();return r||(t=void 0),await u}finally{Ph.delete(onLeave)}}}}function createNamespace(e={}){let t={};return{get(r,s={}){return t[r]||(t[r]=createContext({...e,...s})),t[r]}}}const jh=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof global<`u`?global:typeof window<`u`?window:{},Mh=`__unctx__`;jh[Mh]||(jh[Mh]=createNamespace());const Nh=`__unctx_async_handlers__`,Ph=jh[Nh]||(jh[Nh]=new Set),Fh=createContext(),Ih=createContext();function useLanguageServices(){return Ih.use()}function setMcpServerCtx(e){return e?Fh.set(e,!0):Fh.unset(),e}function setLanguageServicesCtx(e){return e?Ih.set(e,!0):Ih.unset(),e}const Lh=xa.getChild(`mcp`);function likec4Tool(e){return t=>r=>{let{name:s,description:c,...u}=e,d={description:c?.trim()??``,...u};return r.registerTool(s,d,async(...e)=>{let r=useLanguageServices();Lh.debug(`Calling tool {name}, args: {args}`,{name:s,args:e});try{let s=await t.apply(null,[r,...e]);return typeof s==`string`?{content:[{type:`text`,text:s}]}:se(d.outputSchema)?hasProp(s,`content`)?s:{content:[{type:`text`,text:JSON.stringify(s)}]}:{content:[],structuredContent:s}}catch(e){return Lh.error(`Tool ${s} failed`,{err:e}),{content:[{type:`text`,text:loggable(e)}],isError:!0}}}),r}}var Rh=`1.59.0`;function applySemanticLayoutPrompt(e){let t=useLanguageServices();return e.registerPrompt(`apply_semantic_layout`,{title:`Prepare prompt for applying semantic layout to a likec4 view`,argsSchema:{projectId:Ur(V().describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(D(`id`))),viewId:Ur(V().describe(`View ID`),async(r=``,s)=>{let c=s?.arguments?.projectId??t.projectsManager.default.id,u=await t.computedModel(c);return u?Array.from(u.views()).filter(e=>e.id.startsWith(r)).map(D(`id`)):(await e.sendLoggingMessage({level:`warning`,data:`Completing viewId for project ${c} with input value "${r}", model not found`}),[])})}},async({viewId:e,projectId:t},r)=>({messages:[{role:`user`,content:{type:`text`,text:["Call `apply-semantic-layout` tool from `likec4` MCP with these arguments:","projectId: `"+t+"`","viewId: `"+e+"`"].join(`
135
+ `)}}]})),e}function projectResource(e){let t=useLanguageServices();return e.registerResource(`likec4-project`,new Br(`likec4://project/{projectId}`,{list:async()=>({resources:t.projects().map(e=>({uri:`likec4://project/${encodeURIComponent(e.id)}`,name:e.title}))}),complete:{projectId:e=>{if(!e)return t.projects().map(D(`id`));let r=e.toLowerCase();return t.projects().filter(e=>e.id.toLowerCase().includes(r)).map(D(`id`))}}}),{description:`LikeC4 project resource`,mimeType:`application/json`},async(e,{projectId:r})=>{if(!r)return{contents:[]};let s=typeof r==`string`?[r]:r;return{contents:t.projects().filter(e=>s.includes(e.id)).map(e=>({uri:`likec4://project/${encodeURIComponent(e.id)}`,text:JSON.stringify({id:e.id,title:e.title,folder:e.folder.fsPath})}))}}),e}const zh=createLogger(`ai-layout`);function truncate(e,t=100){return e=e.replaceAll(/\n/g,` `).trim(),e.length<=t?e:e.slice(0,t-1)+`…`}function mappedEntries(e){let t={};for(let[r,s]of e.entries())t[s]=r;return t}function edgeLabel(e){let t=e.label&&e.label!==`[...]`?e.label:void 0,r=flattenMarkdownOrString(e.description);return r&&(t=t?`${t}\n${r}`:r),t??=e.technology??void 0,t?truncate(t):void 0}function prepareLLMInput(e){let t=1,r=1,s=new P.default(e=>e.children.length===0?`n${r++}`:`c${t++}`),findNodeById=t=>e.nodes.find(e=>e.id===t),nodeId=e=>s.get(findNodeById(e)),c=new Set;e.nodes.forEach(e=>{s.get(e),e.children.length===0&&c.add(e.id)});let u=e.edges.find(e=>!c.has(e.source)||!c.has(e.target));if(u)throw zh.error(`Non-leaf edge found in view`,{view:e.id,edge:{source:u.source,target:u.target}}),Error(`Non-leaf edge found in view, this is not supported by the current implementation`);let d=1,p=new P.default(e=>`e${d++}`),m=e.edges.map(e=>{let t=nodeId(e.source),r=nodeId(e.target),s=e.parent?nodeId(e.parent):null;e.dir===`back`&&([t,r]=[r,t]);let c=edgeLabel(e);return{id:p.get(e),...c&&{label:c},...s&&{parent:s},source:t,target:r}}),reduceNodes=(e,t)=>{let{level:r,kind:c,...u}=t,d=s.get(t),p=u.children.length>0,m=u.parent?nodeId(u.parent):void 0,h=truncate(u.title);if(p)return e.compounds.push(exact({id:d,title:h,parent:m,children:u.children.map(nodeId),level:r})),e;let g=u.description?truncate(flattenMarkdownOrString(u.description),200):void 0;return e.nodes.push(exact({id:d,kind:c,title:h,description:g,parent:m,level:r})),e};return{serialized:e.nodes.reduce(reduceNodes,{direction:e.autoLayout.direction,compounds:[],nodes:[],edges:m}),mapping:{nodes:mappedEntries(s),edges:mappedEntries(p)}}}const Bh=nr([`TB`,`BT`,`LR`,`RL`]),Vh=R().nonempty().brand(),Hh=z({rank:nr([`same`,`source`,`sink`,`min`,`max`]),nodes:F(Vh)}),Uh={id:R().nonempty().brand(),weight:rr().int().min(0).max(20),minlen:rr().int().min(0).max(4)},Wh=z({source:Vh,target:Vh,weight:Uh.weight.optional(),minlen:Uh.minlen.optional()}),Gh=z({direction:Bh.optional(),ranks:F(Hh).default([]),edgeWeight:mr(Uh.id,Uh.weight).default({}),edgeMinlen:mr(Uh.id,Uh.minlen).default({}),reverseRank:F(Uh.id).default([]),excludeFromRanking:F(Uh.id).default([]),edgeOrder:F(Uh.id).default([]),nodeOrder:F(Vh).default([]),invisibleEdges:F(Wh).default([]),reasoning:R().default(``)}),Kh=/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/;function extractJson(e){let t=Kh.exec(e);if(t&&t[1])return t[1];let r=e.indexOf(`{`),s=e.lastIndexOf(`}`);return r!==-1&&s!==-1&&s>r?e.slice(r,s+1):e.trim()}function parseOutput(e,t){try{let r=extractJson(e),s=mi.parse(r),c=Gh.safeParse(s);if(!c.success){zh.warn(`Failed to validate LLM response
136
+ `+ar(c.error));return}return restoreIdsAndMapToHints(c.data,t)}catch(t){zh.warn(`Failed to parse LLM response
137
+ {response}`,{error:t,response:e});return}}function restoreIdsAndMapToHints(e,t){let{mapping:r}=t,nodeId=e=>{let t=r.nodes[e]?.id;return t||zh.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>k(e,w(nodeId),M(_)),edgeId=e=>{let t=r.edges[e]?.id;return t||zh.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let r=e.map(t).filter(_);return j(r,1)?r:void 0},s=k(e.excludeFromRanking,w(edgeId),M(_),pe(),e=>j(e,1)?e:void 0),c=k(e.reverseRank,w(edgeId),M(_),pe(),e=>j(e,1)?e:void 0),u=(()=>{let e=new Set;return t=>t.filter(t=>e.has(t)?!1:(e.add(t),!0))})(),d=k(e.ranks,w(e=>{let t=u(mapToNodeId(e.nodes));return j(t,1)?{rank:e.rank,nodes:t}:null}),M(x)),p=k(e.invisibleEdges,w(({source:e,target:t,minlen:r=1,weight:s=1})=>{let c=nodeId(e),u=nodeId(t);if(!(!c||!u))return exact({weight:s===1?void 0:s,minlen:r===1?void 0:r,source:c,target:u})}),M(_),re(e=>`${e.source}->${e.target}`),h(([e,...t])=>k(t,Re((e,t)=>exact({...e,...t,weight:e.weight&&t.weight?Math.max(e.weight,t.weight):e.weight||t.weight,minlen:e.minlen&&t.minlen?Math.max(e.minlen,t.minlen):e.minlen||t.minlen}),e))),Be(),e=>j(e,1)?e:void 0),m=e.reasoning;m&&(m=m.replaceAll(`][`,`] [`),be(t.mapping.nodes).forEach(([e,t])=>{m=m.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.id+"`")}),be(t.mapping.edges).forEach(([e,t])=>{m=m.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.source+` -> `+t.target+"`")}));let safeMapEdgeKeys=e=>{let t={};for(let[r,s]of be(e)){let e=edgeId(r);e&&(t[e]=s)}return t};return exact({direction:e.direction,ranks:d,edgeWeight:safeMapEdgeKeys(e.edgeWeight),edgeMinlen:safeMapEdgeKeys(e.edgeMinlen),excludeFromRanking:s,reverseRank:c,edgeOrder:mapToNonEmpty(e.edgeOrder,edgeId),nodeOrder:mapToNonEmpty(e.nodeOrder,nodeId),invisibleEdges:p,reasoning:m})}const qh={systemPrompt:`You are an advisor specializing in software architecture diagrams and graphviz (DOT) layout optimizations.
137
138
  You receive a JSON of Diagram data with:
138
139
  - nodes (architectural elements, rendered as leaf boxes)
139
140
  - compounds (group of nodes or other compounds, define hierarchy and rendered as boxes around children)
@@ -319,9 +320,9 @@ OUTPUT:
319
320
  "reasoning": "I reversed [e4] as it moves [n4] to the top, pushes [n3] to the next row and balances layout, [e5] \`minlen=0\` to keep [n2][n3] on same rank"
320
321
  }
321
322
  \`\`\`
322
- </example>`,userPrompt:`Analyze semantics and suggest layout hints for the following diagram. Return only JSON object without any additional text or markdown formatting.`};async function enhanceLayoutWithAI(e,t,r){try{bf.debug`generating AI layout hints for ${e.id} using ${t.name}`;let{serialized:s,mapping:c}=prepareLLMInput(e);return parseOutput(await t.sendRequest({...Of,view:e,mapping:c,diagram:JSON.stringify(s)},r),{mapping:c,view:e})}catch(e){bf.warn(`AI layout enhancement failed`,{error:e});return}}const kf=W({name:V().describe(`Project identifier`),title:V().optional().describe(`Human-readable project title`),contactPerson:V().optional().describe(`Maintainer contact information`),metadata:Wr(V(),Kr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Yr([V(),H(V())]).optional().describe(`Style inheritance paths`),exclude:H(V()).optional().describe(`File exclusion patterns`),include:W({paths:H(V()).describe(`Include paths`),maxDepth:U().describe(`Maximum directory depth`),fileThreshold:U().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:W({outDir:V().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:W({hasTheme:Hr().describe(`Whether theme customization is defined`),hasDefaults:Hr().describe(`Whether default style values are defined`),hasCustomCss:Hr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function serializeConfig(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 Af=W({id:V().describe(`Element id (FQN)`),name:V().describe(`Element name`),kind:V().describe(`Element kind`),title:V(),tags:H(V()),metadata:Wr(Yr([V(),H(V())])),includedInViews:H(W({id:V().describe(`View id`),title:V().describe(`View title`),type:Zr([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function serializeElement(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:includedInViews(e.views())}}function traverseGraph(e,t,r,s,c,u){invariant(e.findElement(t),`Element "${t}" not found`);let d=new Set,p={},m=0,h=!1,g=[{elementId:t,depth:0}];for(;g.length>0;){let{elementId:t,depth:_}=g.shift();if(_>c||d.has(t))continue;if(d.size>=u){h=!0;break}let v=e.findElement(t);if(!v)continue;d.add(t),m=Math.max(m,_);let y=(r===`incoming`?[...v.incoming(s)]:[...v.outgoing(s)]).map(e=>{let t={elementId:r===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});p[t]={...serializeElement(v),neighbors:y,depth:_};for(let e of y)d.has(e.elementId)||g.push({elementId:e.elementId,depth:_+1})}for(let e of Object.values(p))e.neighbors=e.neighbors.filter(e=>e.elementId in p);return{target:t,totalNodes:d.size,maxDepth:m,truncated:h,nodes:p}}const jf=W({path:V().describe(`Path to the file`),range:W({start:W({line:U(),character:U()}),end:W({line:U(),character:U()})}).describe(`Range in the file`)}).nullable(),Mf=V().refine(e=>!0).default(`default`).describe(`Project id (optional, will use "default" if not specified)`),Nf=H(W({id:V().describe(`View id`),title:V().describe(`View title`),type:Zr([`element`,`deployment`,`dynamic`]).describe(`View type`)})),includedInViews=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),mkLocate=(e,t)=>r=>{try{let s=e.locate({projectId:t,...r});return s?{path:R.parse(s.uri).fsPath,range:s.range}:null}catch(e){return vf.debug(`Failed to locate {params}`,{error:e,params:r}),null}};function toolError(e){return{isError:!0,content:[{type:`text`,text:e}]}}function applySemanticLayoutTool(e){let t=useLanguageServices();return e.registerTool(`apply-semantic-layout`,{description:`Apply semantic layout to the likec4 view`,inputSchema:{projectId:Xr(V().default(`default`).describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(M(`id`))),viewId:Xr(V().describe(`View ID to apply semantic layout to`),async(e,r)=>{let s=r?.arguments?.projectId??t.projectsManager.default.id,c=await t.computedModel(s);if(!c)return[];let u=e??``;return Array.from(c.views()).filter(e=>e.id.startsWith(u)).map(M(`id`))})},outputSchema:{reasoning:V().describe(`Reasoning behind the layout changes`),snapshotUri:V().nullish().describe(`Where snapshot was saved (after applying layout)`)}},async(r,s)=>{let c=t.projectsManager.ensureProjectId(r.projectId);c!==r.projectId&&await e.sendLoggingMessage({level:`notice`,data:`Using project "${c}" instead of "${r.projectId}"`},s.sessionId);let u=await t.computedModel(c),d=u.findView(r.viewId);if(!d)return toolError(`View "${r.viewId}" not found in project "${c}"`);let p=await enhanceLayoutWithAI(d.$view,{name:`MCP`,async sendRequest({systemPrompt:e,userPrompt:t,diagram:r}){let c=await s.sendRequest({method:`sampling/createMessage`,params:{maxTokens:2e4,includeContext:`none`,systemPrompt:e,messages:[{role:`user`,content:{type:`text`,text:t+`
323
+ </example>`,userPrompt:`Analyze semantics and suggest layout hints for the following diagram. Return only JSON object without any additional text or markdown formatting.`};async function enhanceLayoutWithAI(e,t,r){try{zh.debug`generating AI layout hints for ${e.id} using ${t.name}`;let{serialized:s,mapping:c}=prepareLLMInput(e);return parseOutput(await t.sendRequest({...qh,view:e,mapping:c,diagram:JSON.stringify(s)},r),{mapping:c,view:e})}catch(e){zh.warn(`AI layout enhancement failed`,{error:e});return}}const Jh=W({name:V().describe(`Project identifier`),title:V().optional().describe(`Human-readable project title`),contactPerson:V().optional().describe(`Maintainer contact information`),metadata:Lr(V(),zr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Hr([V(),H(V())]).optional().describe(`Style inheritance paths`),exclude:H(V()).optional().describe(`File exclusion patterns`),include:W({paths:H(V()).describe(`Include paths`),maxDepth:U().describe(`Maximum directory depth`),fileThreshold:U().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:W({outDir:V().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:W({hasTheme:Fr().describe(`Whether theme customization is defined`),hasDefaults:Fr().describe(`Whether default style values are defined`),hasCustomCss:Fr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function serializeConfig(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 Yh=W({id:V().describe(`Element id (FQN)`),name:V().describe(`Element name`),kind:V().describe(`Element kind`),title:V(),tags:H(V()),metadata:Lr(Hr([V(),H(V())])),includedInViews:H(W({id:V().describe(`View id`),title:V().describe(`View title`),type:Wr([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function serializeElement(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:includedInViews(e.views())}}function traverseGraph(e,t,r,s,c,u){invariant(e.findElement(t),`Element "${t}" not found`);let d=new Set,p={},m=0,h=!1,g=[{elementId:t,depth:0}];for(;g.length>0;){let{elementId:t,depth:_}=g.shift();if(_>c||d.has(t))continue;if(d.size>=u){h=!0;break}let v=e.findElement(t);if(!v)continue;d.add(t),m=Math.max(m,_);let y=(r===`incoming`?[...v.incoming(s)]:[...v.outgoing(s)]).map(e=>{let t={elementId:r===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});p[t]={...serializeElement(v),neighbors:y,depth:_};for(let e of y)d.has(e.elementId)||g.push({elementId:e.elementId,depth:_+1})}for(let e of Object.values(p))e.neighbors=e.neighbors.filter(e=>e.elementId in p);return{target:t,totalNodes:d.size,maxDepth:m,truncated:h,nodes:p}}const Xh=W({path:V().describe(`Path to the file`),range:W({start:W({line:U(),character:U()}),end:W({line:U(),character:U()})}).describe(`Range in the file`)}).nullable(),Zh=V().refine(e=>!0).default(`default`).describe(`Project id (optional, will use "default" if not specified)`),Qh=H(W({id:V().describe(`View id`),title:V().describe(`View title`),type:Wr([`element`,`deployment`,`dynamic`]).describe(`View type`)})),includedInViews=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),mkLocate=(e,t)=>r=>{try{let s=e.locate({projectId:t,...r});return s?{path:fn.parse(s.uri).fsPath,range:s.range}:null}catch(e){return Lh.debug(`Failed to locate {params}`,{error:e,params:r}),null}};function toolError(e){return{isError:!0,content:[{type:`text`,text:e}]}}function applySemanticLayoutTool(e){let t=useLanguageServices();return e.registerTool(`apply-semantic-layout`,{description:`Apply semantic layout to the likec4 view`,inputSchema:{projectId:Ur(V().default(`default`).describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(D(`id`))),viewId:Ur(V().describe(`View ID to apply semantic layout to`),async(e,r)=>{let s=r?.arguments?.projectId??t.projectsManager.default.id,c=await t.computedModel(s);if(!c)return[];let u=e??``;return Array.from(c.views()).filter(e=>e.id.startsWith(u)).map(D(`id`))})},outputSchema:{reasoning:V().describe(`Reasoning behind the layout changes`),snapshotUri:V().nullish().describe(`Where snapshot was saved (after applying layout)`)}},async(r,s)=>{let c=t.projectsManager.ensureProjectId(r.projectId);c!==r.projectId&&await e.sendLoggingMessage({level:`notice`,data:`Using project "${c}" instead of "${r.projectId}"`},s.sessionId);let u=await t.computedModel(c),d=u.findView(r.viewId);if(!d)return toolError(`View "${r.viewId}" not found in project "${c}"`);let p=await enhanceLayoutWithAI(d.$view,{name:`MCP`,async sendRequest({systemPrompt:e,userPrompt:t,diagram:r}){let c=await s.sendRequest({method:`sampling/createMessage`,params:{maxTokens:2e4,includeContext:`none`,systemPrompt:e,messages:[{role:`user`,content:{type:`text`,text:t+`
323
324
 
324
- `+r}}]}},W({content:W({type:Ur(`text`),text:V()})}));return c.content.type===`text`?c.content.text:JSON.stringify(c.content)}},s.signal);if(!p)return await e.sendLoggingMessage({level:`error`,data:`Failed to generate layout hints`},s.sessionId),toolError(`Failed to generate layout hints`);await e.sendLoggingMessage({level:`info`,data:`Applying semantic layout...`},s.sessionId);let m=await t.views.layouter.aiLayout({view:d.$view,styles:u.$styles},p),h=await t.editor.applyChange({change:{op:`save-view-snapshot`,layout:m.diagram},viewId:d.id,projectId:c});return await e.sendLoggingMessage({level:`info`,data:`Layout applied successfully`},s.sessionId),{content:[],structuredContent:{reasoning:p.reasoning,...!!h.location&&{snapshotUri:h.location.uri.toString()}}}}),e}const Pf=Af.extend({description:V().nullable().describe(`Element description`),technology:V().nullable().describe(`Element technology`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),children:H(V()).describe(`Direct child element ids`),incomingCount:U().describe(`Number of incoming relationships`),outgoingCount:U().describe(`Number of outgoing relationships`)}),Ff=likec4Tool({name:`batch-read-elements`,description:`
325
+ `+r}}]}},W({content:W({type:Ir(`text`),text:V()})}));return c.content.type===`text`?c.content.text:JSON.stringify(c.content)}},s.signal);if(!p)return await e.sendLoggingMessage({level:`error`,data:`Failed to generate layout hints`},s.sessionId),toolError(`Failed to generate layout hints`);await e.sendLoggingMessage({level:`info`,data:`Applying semantic layout...`},s.sessionId);let m=await t.views.layouter.aiLayout({view:d.$view,styles:u.$styles},p),h=await t.editor.applyChange({change:{op:`save-view-snapshot`,layout:m.diagram},viewId:d.id,projectId:c});return await e.sendLoggingMessage({level:`info`,data:`Layout applied successfully`},s.sessionId),{content:[],structuredContent:{reasoning:p.reasoning,...!!h.location&&{snapshotUri:h.location.uri.toString()}}}}),e}const $h=Yh.extend({description:V().nullable().describe(`Element description`),technology:V().nullable().describe(`Element technology`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),children:H(V()).describe(`Direct child element ids`),incomingCount:U().describe(`Number of incoming relationships`),outgoingCount:U().describe(`Number of outgoing relationships`)}),eg=likec4Tool({name:`batch-read-elements`,description:`
325
326
  Read details of multiple elements in a single call, reducing round-trips.
326
327
  Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
327
328
 
@@ -383,7 +384,7 @@ Example response:
383
384
  ],
384
385
  "notFound": []
385
386
  }
386
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:H(V()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:Mf},outputSchema:{elements:H(Pf),notFound:H(V()).describe(`Element ids that were not found`)}})(async(e,t)=>{invariant(t.ids.length<=50,`Maximum 50 element ids per call`);let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=[],u=[];for(let e of t.ids){let t=s.findElement(e);if(!t){u.push(e);continue}c.push({...serializeElement(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:c,notFound:u}}),If=W({id:V(),kind:V(),title:V(),description:V().nullable(),technology:V().nullable(),shape:V(),color:V()}),Lf=W({element1:If,element2:If,propertyDiffs:H(W({property:V().describe(`Property name`),element1Value:V().nullable().describe(`Value in element1`),element2Value:V().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:W({onlyInElement1:H(V()).describe(`Tags present only in element1`),onlyInElement2:H(V()).describe(`Tags present only in element2`),common:H(V()).describe(`Tags present in both elements`)}),metadata:W({onlyInElement1:Wr(Yr([V(),H(V())])).describe(`Metadata keys only in element1`),onlyInElement2:Wr(Yr([V(),H(V())])).describe(`Metadata keys only in element2`),different:H(W({key:V(),element1Value:Yr([V(),H(V())]),element2Value:Yr([V(),H(V())])})).describe(`Metadata keys present in both but with different values`),common:Wr(Yr([V(),H(V())])).describe(`Metadata keys with identical values in both`)}),relationships:W({incomingOnlyElement1:U().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:U().describe(`Count of unique source elements sending to element2 only`),incomingShared:U().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:U().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:U().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:U().describe(`Count of unique target elements receiving from both`)})}),Rf=likec4Tool({name:`element-diff`,description:`
387
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:H(V()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:Zh},outputSchema:{elements:H($h),notFound:H(V()).describe(`Element ids that were not found`)}})(async(e,t)=>{invariant(t.ids.length<=50,`Maximum 50 element ids per call`);let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=[],u=[];for(let e of t.ids){let t=s.findElement(e);if(!t){u.push(e);continue}c.push({...serializeElement(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:c,notFound:u}}),tg=W({id:V(),kind:V(),title:V(),description:V().nullable(),technology:V().nullable(),shape:V(),color:V()}),ng=W({element1:tg,element2:tg,propertyDiffs:H(W({property:V().describe(`Property name`),element1Value:V().nullable().describe(`Value in element1`),element2Value:V().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:W({onlyInElement1:H(V()).describe(`Tags present only in element1`),onlyInElement2:H(V()).describe(`Tags present only in element2`),common:H(V()).describe(`Tags present in both elements`)}),metadata:W({onlyInElement1:Lr(Hr([V(),H(V())])).describe(`Metadata keys only in element1`),onlyInElement2:Lr(Hr([V(),H(V())])).describe(`Metadata keys only in element2`),different:H(W({key:V(),element1Value:Hr([V(),H(V())]),element2Value:Hr([V(),H(V())])})).describe(`Metadata keys present in both but with different values`),common:Lr(Hr([V(),H(V())])).describe(`Metadata keys with identical values in both`)}),relationships:W({incomingOnlyElement1:U().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:U().describe(`Count of unique source elements sending to element2 only`),incomingShared:U().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:U().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:U().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:U().describe(`Count of unique target elements receiving from both`)})}),rg=likec4Tool({name:`element-diff`,description:`
387
388
  Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
388
389
 
389
390
  Request:
@@ -443,7 +444,7 @@ Example response:
443
444
  "outgoingShared": 2
444
445
  }
445
446
  }
446
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:V().describe(`First element id (FQN)`),element2Id:V().describe(`Second element id (FQN)`),project:Mf},outputSchema:Lf.shape})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=s.findElement(t.element1Id);invariant(c,`Element "${t.element1Id}" not found in project "${r}"`);let u=s.findElement(t.element2Id);invariant(u,`Element "${t.element2Id}" not found in project "${r}"`);let d=[],p=[{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 p){let t=e.get(c),r=e.get(u);t!==r&&d.push({property:e.name,element1Value:t,element2Value:r})}let m=new Set(c.tags),h=new Set(u.tags),g=[],_=[],v=[];for(let e of m)h.has(e)?g.push(e):_.push(e);for(let e of h)m.has(e)||v.push(e);let y=c.getMetadata(),b=u.getMetadata(),x=new Set([...Object.keys(y),...Object.keys(b)]),S={},w={},T=[],E={};for(let e of x){let t=y[e],r=b[e];t!==void 0&&r===void 0?S[e]=t:t===void 0&&r!==void 0?w[e]=r:t!==void 0&&r!==void 0&&(JSON.stringify(t)===JSON.stringify(r)?E[e]=t:T.push({key:e,element1Value:t,element2Value:r}))}let D=new Set([...c.incoming()].map(e=>e.source.id)),ee=new Set([...u.incoming()].map(e=>e.source.id)),te=new Set([...c.outgoing()].map(e=>e.target.id)),k=new Set([...u.outgoing()].map(e=>e.target.id)),A=0,ne=0,j=0;for(let e of D)ee.has(e)?A++:ne++;for(let e of ee)D.has(e)||j++;let re=0,ie=0,ae=0;for(let e of te)k.has(e)?re++:ie++;for(let e of k)te.has(e)||ae++;return{element1:{id:c.id,kind:c.kind,title:c.title,description:c.description.text,technology:c.technology,shape:c.shape,color:c.color},element2:{id:u.id,kind:u.kind,title:u.title,description:u.description.text,technology:u.technology,shape:u.shape,color:u.color},propertyDiffs:d,tags:{onlyInElement1:_,onlyInElement2:v,common:g},metadata:{onlyInElement1:S,onlyInElement2:w,different:T,common:E},relationships:{incomingOnlyElement1:ne,incomingOnlyElement2:j,incomingShared:A,outgoingOnlyElement1:ie,outgoingOnlyElement2:ae,outgoingShared:re}}}),zf=likec4Tool({name:`find-relationship-paths`,description:`
447
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:V().describe(`First element id (FQN)`),element2Id:V().describe(`Second element id (FQN)`),project:Zh},outputSchema:ng.shape})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=s.findElement(t.element1Id);invariant(c,`Element "${t.element1Id}" not found in project "${r}"`);let u=s.findElement(t.element2Id);invariant(u,`Element "${t.element2Id}" not found in project "${r}"`);let d=[],p=[{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 p){let t=e.get(c),r=e.get(u);t!==r&&d.push({property:e.name,element1Value:t,element2Value:r})}let m=new Set(c.tags),h=new Set(u.tags),g=[],_=[],v=[];for(let e of m)h.has(e)?g.push(e):_.push(e);for(let e of h)m.has(e)||v.push(e);let y=c.getMetadata(),b=u.getMetadata(),ee=new Set([...Object.keys(y),...Object.keys(b)]),te={},x={},S=[],w={};for(let e of ee){let t=y[e],r=b[e];t!==void 0&&r===void 0?te[e]=t:t===void 0&&r!==void 0?x[e]=r:t!==void 0&&r!==void 0&&(JSON.stringify(t)===JSON.stringify(r)?w[e]=t:S.push({key:e,element1Value:t,element2Value:r}))}let ne=new Set([...c.incoming()].map(e=>e.source.id)),re=new Set([...u.incoming()].map(e=>e.source.id)),ie=new Set([...c.outgoing()].map(e=>e.target.id)),T=new Set([...u.outgoing()].map(e=>e.target.id)),ae=0,oe=0,se=0;for(let e of ne)re.has(e)?ae++:oe++;for(let e of re)ne.has(e)||se++;let ce=0,E=0,le=0;for(let e of ie)T.has(e)?ce++:E++;for(let e of T)ie.has(e)||le++;return{element1:{id:c.id,kind:c.kind,title:c.title,description:c.description.text,technology:c.technology,shape:c.shape,color:c.color},element2:{id:u.id,kind:u.kind,title:u.title,description:u.description.text,technology:u.technology,shape:u.shape,color:u.color},propertyDiffs:d,tags:{onlyInElement1:_,onlyInElement2:v,common:g},metadata:{onlyInElement1:te,onlyInElement2:x,different:S,common:w},relationships:{incomingOnlyElement1:oe,incomingOnlyElement2:se,incomingShared:ae,outgoingOnlyElement1:E,outgoingOnlyElement2:le,outgoingShared:ce}}}),ig=likec4Tool({name:`find-relationship-paths`,description:`
447
448
  Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
448
449
 
449
450
  Request:
@@ -532,7 +533,7 @@ Example response:
532
533
  }
533
534
  ]
534
535
  }
535
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:V().describe(`Source element FQN`),targetId:V().describe(`Target element FQN`),maxDepth:U().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Hr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:Mf},outputSchema:{paths:H(W({length:U().describe(`Number of hops in the path`),steps:H(W({source:V().describe(`Source element FQN`),target:V().describe(`Target element FQN`),relationship:W({kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=s.findElement(t.sourceId);invariant(c,`Source element "${t.sourceId}" not found in project "${r}"`);let u=s.findElement(t.targetId);invariant(u,`Target element "${t.targetId}" not found in project "${r}"`),invariant(c.id!==u.id,`Source and target must be different elements`);let d=t.maxDepth,p=t.includeIndirect?`all`:`direct`,m=[{elementId:c.id,path:[],visited:new Set([c.id])}],h=[];for(;m.length>0&&h.length<100;){let e=m.shift();if(e.path.length>=d)continue;let t=s.findElement(e.elementId);if(t)for(let r of t.outgoing(p)){let t=r.target.id;if(t===u.id){let t={source:r.source.id,target:r.target.id,relationship:{kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags]}};if(h.push({length:e.path.length+1,steps:[...e.path,t]}),h.length>=100)break;continue}if(e.visited.has(t))continue;let s={source:r.source.id,target:r.target.id,relationship:{kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags]}};m.push({elementId:t,path:[...e.path,s],visited:new Set([...e.visited,t])})}}return h.sort((e,t)=>e.length-t.length),{paths:h}}),Bf=W({id:V(),title:V(),kind:V()}),Vf=W({type:Zr([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:Bf,target:Bf,kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`),includedInViews:Nf.describe(`Views that include this relationship`),sourceLocation:jf}),Hf=likec4Tool({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
536
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:V().describe(`Source element FQN`),targetId:V().describe(`Target element FQN`),maxDepth:U().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Fr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:Zh},outputSchema:{paths:H(W({length:U().describe(`Number of hops in the path`),steps:H(W({source:V().describe(`Source element FQN`),target:V().describe(`Target element FQN`),relationship:W({kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=s.findElement(t.sourceId);invariant(c,`Source element "${t.sourceId}" not found in project "${r}"`);let u=s.findElement(t.targetId);invariant(u,`Target element "${t.targetId}" not found in project "${r}"`),invariant(c.id!==u.id,`Source and target must be different elements`);let d=t.maxDepth,p=t.includeIndirect?`all`:`direct`,m=[{elementId:c.id,path:[],visited:new Set([c.id])}],h=[];for(;m.length>0&&h.length<100;){let e=m.shift();if(e.path.length>=d)continue;let t=s.findElement(e.elementId);if(t)for(let r of t.outgoing(p)){let t=r.target.id;if(t===u.id){let t={source:r.source.id,target:r.target.id,relationship:{kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags]}};if(h.push({length:e.path.length+1,steps:[...e.path,t]}),h.length>=100)break;continue}if(e.visited.has(t))continue;let s={source:r.source.id,target:r.target.id,relationship:{kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags]}};m.push({elementId:t,path:[...e.path,s],visited:new Set([...e.visited,t])})}}return h.sort((e,t)=>e.length-t.length),{paths:h}}),ag=W({id:V(),title:V(),kind:V()}),og=W({type:Wr([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:ag,target:ag,kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`),includedInViews:Qh.describe(`Views that include this relationship`),sourceLocation:Xh}),sg=likec4Tool({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
536
537
  Find relationships between two LikeC4 elements within a project.
537
538
 
538
539
  What it does:
@@ -603,7 +604,7 @@ Response:
603
604
  }
604
605
  ]
605
606
  }
606
- `,inputSchema:{element1:V().describe(`Element ID (FQN)`),element2:V().describe(`Element ID (FQN)`),project:Mf},outputSchema:{found:H(Vf)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project);if(isSameHierarchy(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let s=[],c=await e.computedModel(r),u=c.findElement(t.element1);invariant(u,`Element "${t.element1}" not found in project "${r}"`);let d=c.findElement(t.element2);invariant(d,`Element "${t.element2}" not found in project "${r}"`);let p=mkLocate(e,r),m=findConnection$3(u,d,`both`).flatMap(e=>[...e.relations]);for(let e of m){let t=e.source===u&&e.target===d||e.source===d&&e.target===u;s.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:includedInViews(e.views()),sourceLocation:p({relation:e.id})})}return{found:s}}),Uf=likec4Tool({name:`list-projects`,description:`
607
+ `,inputSchema:{element1:V().describe(`Element ID (FQN)`),element2:V().describe(`Element ID (FQN)`),project:Zh},outputSchema:{found:H(og)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project);if(isSameHierarchy(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let s=[],c=await e.computedModel(r),u=c.findElement(t.element1);invariant(u,`Element "${t.element1}" not found in project "${r}"`);let d=c.findElement(t.element2);invariant(d,`Element "${t.element2}" not found in project "${r}"`);let p=mkLocate(e,r),m=findConnection$3(u,d,`both`).flatMap(e=>[...e.relations]);for(let e of m){let t=e.source===u&&e.target===d||e.source===d&&e.target===u;s.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:includedInViews(e.views()),sourceLocation:p({relation:e.id})})}return{found:s}}),cg=likec4Tool({name:`list-projects`,description:`
607
608
  List LikeC4 projects discoverable in the current workspace.
608
609
 
609
610
  Request:
@@ -636,7 +637,7 @@ Example response:
636
637
  }
637
638
  ]
638
639
  }
639
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},inputSchema:{},outputSchema:{projects:H(W({id:V(),title:V(),folder:V(),sources:H(V())}))}})(async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),Wf=Zr([`exact`,`contains`,`exists`]),Gf=likec4Tool({name:`query-by-metadata`,description:`
640
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},inputSchema:{},outputSchema:{projects:H(W({id:V(),title:V(),folder:V(),sources:H(V())}))}})(async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),lg=Wr([`exact`,`contains`,`exists`]),ug=likec4Tool({name:`query-by-metadata`,description:`
640
641
  Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
641
642
 
642
643
  Request:
@@ -702,7 +703,7 @@ Example response:
702
703
  }
703
704
  ]
704
705
  }
705
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:V().describe(`Metadata key to filter by`),value:V().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Wf.optional().default(`exact`).describe(`Matching mode`),project:Mf},outputSchema:{results:H(Af.extend({matchedValue:V().describe(`The metadata value that matched`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=t.matchMode,u=[],matches=(e,t,r)=>{let s=Array.isArray(e)?e:[e];switch(r){case`exists`:return!0;case`exact`:return t===void 0?!1:s.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return s.some(t=>t.toLowerCase().includes(e))}default:return!1}},getMatchedValue=(e,t,r)=>{let s=Array.isArray(e)?e:[e];if(r===`exists`||t===void 0)return s[0]||``;if(r===`exact`)return s.find(e=>e===t)||s[0]||``;if(r===`contains`){let e=t.toLowerCase();return s.find(t=>t.toLowerCase().includes(e))||s[0]||``}return s[0]||``};for(let e of s.elements()){if(u.length>=50)break;let r=e.getMetadata();if(t.key in r){let s=r[t.key];s!==void 0&&matches(s,t.value,c)&&u.push({...serializeElement(e),matchedValue:getMatchedValue(s,t.value,c)})}}if(u.length<50)for(let e of s.deployment.elements()){if(u.length>=50)break;let r=e.getMetadata();if(t.key in r){let s=r[t.key];s!==void 0&&matches(s,t.value,c)&&u.push({...serializeElement(e),matchedValue:getMatchedValue(s,t.value,c)})}}return{results:u}}),Kf=likec4Tool({name:`query-by-tag-pattern`,description:`
706
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:V().describe(`Metadata key to filter by`),value:V().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:lg.optional().default(`exact`).describe(`Matching mode`),project:Zh},outputSchema:{results:H(Yh.extend({matchedValue:V().describe(`The metadata value that matched`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=t.matchMode,u=[],matches=(e,t,r)=>{let s=Array.isArray(e)?e:[e];switch(r){case`exists`:return!0;case`exact`:return t!==void 0&&s.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return s.some(t=>t.toLowerCase().includes(e))}default:return!1}},getMatchedValue=(e,t,r)=>{let s=Array.isArray(e)?e:[e];if(r===`exists`||t===void 0)return s[0]||``;if(r===`exact`)return s.find(e=>e===t)||s[0]||``;if(r===`contains`){let e=t.toLowerCase();return s.find(t=>t.toLowerCase().includes(e))||s[0]||``}return s[0]||``};for(let e of s.elements()){if(u.length>=50)break;let r=e.getMetadata();if(t.key in r){let s=r[t.key];s!==void 0&&matches(s,t.value,c)&&u.push({...serializeElement(e),matchedValue:getMatchedValue(s,t.value,c)})}}if(u.length<50)for(let e of s.deployment.elements()){if(u.length>=50)break;let r=e.getMetadata();if(t.key in r){let s=r[t.key];s!==void 0&&matches(s,t.value,c)&&u.push({...serializeElement(e),matchedValue:getMatchedValue(s,t.value,c)})}}return{results:u}}),dg=likec4Tool({name:`query-by-tag-pattern`,description:`
706
707
  Search elements by tag patterns using prefix or substring matching.
707
708
  Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
708
709
 
@@ -757,7 +758,7 @@ Example response:
757
758
  "truncated": false,
758
759
  "matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
759
760
  }
760
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:V().min(1).describe(`Tag pattern to match`),matchMode:Zr([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:Mf},outputSchema:{results:H(Af.extend({matchedTags:H(V()).describe(`Tags that matched the pattern`)})),truncated:Hr().describe(`True if results were truncated`),matchedTagValues:H(V()).describe(`All unique tag values matching the pattern across all elements`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=t.pattern.toLowerCase(),matchesTag=e=>{let r=e.toLowerCase();switch(t.matchMode){case`prefix`:return r.startsWith(c);case`contains`:return r.includes(c);case`suffix`:return r.endsWith(c)}},u=[],d=!1,p=new Set;for(let e of s.elements()){let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>p.add(e)),u.length>=50){d=!0;continue}u.push({...serializeElement(e),matchedTags:t})}}for(let e of s.deployment.elements()){if(!isDeploymentNodeModel(e))continue;let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>p.add(e)),u.length>=50){d=!0;continue}u.push({...serializeElement(e),matchedTags:t})}}return{results:u,truncated:d,matchedTagValues:[...p].sort((e,t)=>e.localeCompare(t))}}),qf=likec4Tool({name:`query-by-tags`,description:`
761
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:V().min(1).describe(`Tag pattern to match`),matchMode:Wr([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:Zh},outputSchema:{results:H(Yh.extend({matchedTags:H(V()).describe(`Tags that matched the pattern`)})),truncated:Fr().describe(`True if results were truncated`),matchedTagValues:H(V()).describe(`All unique tag values matching the pattern across all elements`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=t.pattern.toLowerCase(),matchesTag=e=>{let r=e.toLowerCase();switch(t.matchMode){case`prefix`:return r.startsWith(c);case`contains`:return r.includes(c);case`suffix`:return r.endsWith(c)}},u=[],d=!1,p=new Set;for(let e of s.elements()){let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>p.add(e)),u.length>=50){d=!0;continue}u.push({...serializeElement(e),matchedTags:t})}}for(let e of s.deployment.elements()){if(!isDeploymentNodeModel(e))continue;let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>p.add(e)),u.length>=50){d=!0;continue}u.push({...serializeElement(e),matchedTags:t})}}return{results:u,truncated:d,matchedTagValues:[...p].sort((e,t)=>e.localeCompare(t))}}),fg=likec4Tool({name:`query-by-tags`,description:`
761
762
  Advanced tag filtering with boolean logic (AND, OR, NOT).
762
763
 
763
764
  Request:
@@ -821,7 +822,7 @@ Example response:
821
822
  }
822
823
  ]
823
824
  }
824
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:H(V()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:H(V()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:H(V()).optional().describe(`Element must have NONE of these tags (NOT)`),project:Mf},outputSchema:{results:H(Af),truncated:Hr().describe(`True if results were truncated due to exceeding the 50-result limit`)}})(async(e,t)=>{invariant(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 r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=[],u=!1,matchesTags=e=>{let r=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>r.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>r.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>r.has(e)))};for(let e of s.elements()){if(c.length>=50){u=!0;break}matchesTags(e.tags)&&c.push(serializeElement(e))}if(!u)for(let e of s.deployment.elements()){if(c.length>=50){u=!0;break}isDeploymentNodeModel(e)&&matchesTags(e.tags)&&c.push(serializeElement(e))}return{results:c,truncated:u}}),Jf=Zr([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Yf=likec4Tool({name:`query-graph`,description:`
825
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:H(V()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:H(V()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:H(V()).optional().describe(`Element must have NONE of these tags (NOT)`),project:Zh},outputSchema:{results:H(Yh),truncated:Fr().describe(`True if results were truncated due to exceeding the 50-result limit`)}})(async(e,t)=>{invariant(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 r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r),c=[],u=!1,matchesTags=e=>{let r=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>r.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>r.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>r.has(e)))};for(let e of s.elements()){if(c.length>=50){u=!0;break}matchesTags(e.tags)&&c.push(serializeElement(e))}if(!u)for(let e of s.deployment.elements()){if(c.length>=50){u=!0;break}isDeploymentNodeModel(e)&&matchesTags(e.tags)&&c.push(serializeElement(e))}return{results:c,truncated:u}}),pg=Wr([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),mg=likec4Tool({name:`query-graph`,description:`
825
826
  Query element hierarchy and relationships in the architecture graph.
826
827
 
827
828
  Request:
@@ -893,7 +894,7 @@ Example response:
893
894
  ],
894
895
  "truncated": false
895
896
  }
896
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:V().describe(`Element id (FQN) to query`),queryType:Jf.describe(`Type of graph query`),includeIndirect:Hr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:Mf},outputSchema:{results:H(Af),truncated:Hr().describe(`True if results were truncated due to exceeding maximum limit`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.elementId);invariant(s,`Element "${t.elementId}" not found in project "${r}"`);let c=[],u=!1;switch(t.queryType){case`ancestors`:for(let e of s.ancestors()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`descendants`:for(let e of s.descendants()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`siblings`:for(let e of s.siblings()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`children`:for(let e of s.children()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`parent`:{let e=s.parent;e&&c.push(serializeElement(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of s.incomers(e)){if(c.length>=100){u=!0;break}c.push(serializeElement(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of s.outgoers(e)){if(c.length>=100){u=!0;break}c.push(serializeElement(t))}break}}return{results:c,truncated:u}}),Xf=W({elementId:V().describe(`ID of the incoming element`),relationshipLabel:V().optional().describe(`Label on the relationship`),technology:V().optional().describe(`Technology specified on the relationship`)}),Zf=likec4Tool({name:`query-incomers-graph`,description:`
897
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:V().describe(`Element id (FQN) to query`),queryType:pg.describe(`Type of graph query`),includeIndirect:Fr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:Zh},outputSchema:{results:H(Yh),truncated:Fr().describe(`True if results were truncated due to exceeding maximum limit`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.elementId);invariant(s,`Element "${t.elementId}" not found in project "${r}"`);let c=[],u=!1;switch(t.queryType){case`ancestors`:for(let e of s.ancestors()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`descendants`:for(let e of s.descendants()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`siblings`:for(let e of s.siblings()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`children`:for(let e of s.children()){if(c.length>=100){u=!0;break}c.push(serializeElement(e))}break;case`parent`:{let e=s.parent;e&&c.push(serializeElement(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of s.incomers(e)){if(c.length>=100){u=!0;break}c.push(serializeElement(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of s.outgoers(e)){if(c.length>=100){u=!0;break}c.push(serializeElement(t))}break}}return{results:c,truncated:u}}),hg=W({elementId:V().describe(`ID of the incoming element`),relationshipLabel:V().optional().describe(`Label on the relationship`),technology:V().optional().describe(`Technology specified on the relationship`)}),gg=likec4Tool({name:`query-incomers-graph`,description:`
897
898
  Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
898
899
 
899
900
  This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
@@ -950,7 +951,7 @@ Notes:
950
951
  Example:
951
952
  For a database element, this returns all services, APIs, and components that write to it,
952
953
  plus all their dependencies, recursively up to maxDepth levels.
953
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:V().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Hr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:U().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:U().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Mf},outputSchema:{target:V().describe(`Target element id`),totalNodes:U().describe(`Total number of nodes in the graph`),maxDepth:U().describe(`Maximum depth reached`),truncated:Hr().describe(`True if result was truncated due to maxNodes limit`),nodes:Wr(Af.extend({incomers:H(Xf).describe(`Incoming relationships with details`),depth:U().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r);invariant(s.findElement(t.elementId),`Element "${t.elementId}" not found in project "${r}"`);let c=t.includeIndirect?`all`:`direct`,u=traverseGraph(s,t.elementId,`incoming`,c,t.maxDepth,t.maxNodes),d={};for(let[e,t]of Object.entries(u.nodes)){let{neighbors:r,...s}=t;d[e]={...s,incomers:r}}return{target:u.target,totalNodes:u.totalNodes,maxDepth:u.maxDepth,truncated:u.truncated,nodes:d}}),Qf=W({elementId:V().describe(`ID of the outgoing element`),relationshipLabel:V().optional().describe(`Label on the relationship`),technology:V().optional().describe(`Technology specified on the relationship`)}),$f=likec4Tool({name:`query-outgoers-graph`,description:`
954
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:V().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Fr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:U().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:U().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Zh},outputSchema:{target:V().describe(`Target element id`),totalNodes:U().describe(`Total number of nodes in the graph`),maxDepth:U().describe(`Maximum depth reached`),truncated:Fr().describe(`True if result was truncated due to maxNodes limit`),nodes:Lr(Yh.extend({incomers:H(hg).describe(`Incoming relationships with details`),depth:U().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r);invariant(s.findElement(t.elementId),`Element "${t.elementId}" not found in project "${r}"`);let c=t.includeIndirect?`all`:`direct`,u=traverseGraph(s,t.elementId,`incoming`,c,t.maxDepth,t.maxNodes),d={};for(let[e,t]of Object.entries(u.nodes)){let{neighbors:r,...s}=t;d[e]={...s,incomers:r}}return{target:u.target,totalNodes:u.totalNodes,maxDepth:u.maxDepth,truncated:u.truncated,nodes:d}}),_g=W({elementId:V().describe(`ID of the outgoing element`),relationshipLabel:V().optional().describe(`Label on the relationship`),technology:V().optional().describe(`Technology specified on the relationship`)}),vg=likec4Tool({name:`query-outgoers-graph`,description:`
954
955
  Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
955
956
 
956
957
  This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
@@ -1007,7 +1008,7 @@ Notes:
1007
1008
  Example:
1008
1009
  For an API service, this returns all clients, services, and systems that consume its output,
1009
1010
  plus all their consumers, recursively up to maxDepth levels.
1010
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:V().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Hr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:U().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:U().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Mf},outputSchema:{target:V().describe(`Target element id`),totalNodes:U().describe(`Total number of nodes in the graph`),maxDepth:U().describe(`Maximum depth reached`),truncated:Hr().describe(`True if result was truncated due to maxNodes limit`),nodes:Wr(Af.extend({outgoers:H(Qf).describe(`Outgoing relationships with details`),depth:U().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r);invariant(s.findElement(t.elementId),`Element "${t.elementId}" not found in project "${r}"`);let c=t.includeIndirect?`all`:`direct`,u=traverseGraph(s,t.elementId,`outgoing`,c,t.maxDepth,t.maxNodes),d={};for(let[e,t]of Object.entries(u.nodes)){let{neighbors:r,...s}=t;d[e]={...s,outgoers:r}}return{target:u.target,totalNodes:u.totalNodes,maxDepth:u.maxDepth,truncated:u.truncated,nodes:d}}),ep=likec4Tool({name:`read-deployment`,description:`
1011
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:V().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Fr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:U().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:U().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:Zh},outputSchema:{target:V().describe(`Target element id`),totalNodes:U().describe(`Total number of nodes in the graph`),maxDepth:U().describe(`Maximum depth reached`),truncated:Fr().describe(`True if result was truncated due to maxNodes limit`),nodes:Lr(Yh.extend({outgoers:H(_g).describe(`Outgoing relationships with details`),depth:U().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=await e.computedModel(r);invariant(s.findElement(t.elementId),`Element "${t.elementId}" not found in project "${r}"`);let c=t.includeIndirect?`all`:`direct`,u=traverseGraph(s,t.elementId,`outgoing`,c,t.maxDepth,t.maxNodes),d={};for(let[e,t]of Object.entries(u.nodes)){let{neighbors:r,...s}=t;d[e]={...s,outgoers:r}}return{target:u.target,totalNodes:u.totalNodes,maxDepth:u.maxDepth,truncated:u.truncated,nodes:d}}),yg=likec4Tool({name:`read-deployment`,description:`
1011
1012
  Read details about a deployment node or a deployed instance in a LikeC4 project.
1012
1013
 
1013
1014
  What it does:
@@ -1072,7 +1073,7 @@ Example response (deployed instance):
1072
1073
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
1073
1074
  }
1074
1075
  }
1075
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:V().describe(`Deployment id (FQN)`),project:Mf},outputSchema:{type:Zr([`deployment-node`,`deployed-instance`]),id:V().describe(`Deployment id (FQN)`),kind:V().describe(`Deployment node kind, or element kind for deployed instances`),name:V(),title:V(),description:V().nullable(),technology:V().nullable(),tags:H(V()),project:V(),metadata:Wr(Yr([V(),H(V())])),links:H(W({title:V().nullable().describe(`Optional link title`),url:V().describe(`Link URL`),relative:V().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:V(),color:V(),children:H(V()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:Nf.describe(`Views that include this deployment node`),instanceof:W({id:V().describe(`Element ID (FQN)`),title:V(),kind:V()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:jf}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).deployment.findElement(t.id);invariant(s,`Deployment entity "${t.id}" not found in project "${r}"`);let c=mkLocate(e,r);return{type:s.isInstance()?`deployed-instance`:`deployment-node`,id:s.id,name:s.name,kind:s.kind,title:s.title,description:s.description.text,technology:s.technology,tags:[...s.tags],project:r,metadata:s.getMetadata(),links:(s.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:s.shape,color:s.color,children:s.isInstance()?[]:[...s.children()].map(e=>e.id),includedInViews:includedInViews(s.views()),instanceof:s.isInstance()?{id:s.element.id,title:s.element.title,kind:s.element.kind}:null,sourceLocation:c({deployment:s.id})}}),tp=likec4Tool({name:`read-element`,description:`
1076
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:V().describe(`Deployment id (FQN)`),project:Zh},outputSchema:{type:Wr([`deployment-node`,`deployed-instance`]),id:V().describe(`Deployment id (FQN)`),kind:V().describe(`Deployment node kind, or element kind for deployed instances`),name:V(),title:V(),description:V().nullable(),technology:V().nullable(),tags:H(V()),project:V(),metadata:Lr(Hr([V(),H(V())])),links:H(W({title:V().nullable().describe(`Optional link title`),url:V().describe(`Link URL`),relative:V().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:V(),color:V(),children:H(V()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:Qh.describe(`Views that include this deployment node`),instanceof:W({id:V().describe(`Element ID (FQN)`),title:V(),kind:V()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:Xh}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).deployment.findElement(t.id);invariant(s,`Deployment entity "${t.id}" not found in project "${r}"`);let c=mkLocate(e,r);return{type:s.isInstance()?`deployed-instance`:`deployment-node`,id:s.id,name:s.name,kind:s.kind,title:s.title,description:s.description.text,technology:s.technology,tags:[...s.tags],project:r,metadata:s.getMetadata(),links:(s.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:s.shape,color:s.color,children:s.isInstance()?[]:[...s.children()].map(e=>e.id),includedInViews:includedInViews(s.views()),instanceof:s.isInstance()?{id:s.element.id,title:s.element.title,kind:s.element.kind}:null,sourceLocation:c({deployment:s.id})}}),bg=likec4Tool({name:`read-element`,description:`
1076
1077
  Read detailed information about a LikeC4 element.
1077
1078
 
1078
1079
  Request:
@@ -1159,7 +1160,7 @@ Example response:
1159
1160
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
1160
1161
  }
1161
1162
  }
1162
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:V().describe(`Element id (FQN)`),project:Mf},outputSchema:{id:V().describe(`Element id (FQN)`),kind:V().describe(`Element kind`),name:V().describe(`Element name`),title:V(),description:V().nullable(),technology:V().nullable(),tags:H(V()),project:V(),metadata:Wr(Yr([V(),H(V())])),links:H(W({title:V().nullable().describe(`Optional link title`),url:V().describe(`Link URL`),relative:V().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:V(),color:V(),children:H(V()).describe(`Children of this element (Array of FQNs)`),defaultView:V().nullable().describe(`Name of the default view of this element`),includedInViews:Nf.describe(`Views that include this element`),relationships:W({incoming:H(W({source:W({id:V(),title:V(),kind:V()}).describe(`Source element of this relationship`),kind:V().nullable().describe(`Relationship kind`),target:V().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:H(W({source:V().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:W({id:V(),title:V(),kind:V()}).describe(`Target element of this relationship`),kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:H(V()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:jf}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.id);invariant(s,`Element "${t.id}" not found in project "${r}"`);let c=mkLocate(e,r);return{id:s.id,name:s.name,kind:s.kind,title:s.title,description:s.description.text,technology:s.technology,tags:[...s.tags],project:r,metadata:s.getMetadata(),links:(s.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:s.shape,color:s.color,children:[...s.children()].map(e=>e.id),defaultView:s.defaultView?.id||null,includedInViews:includedInViews(s.views()),relationships:{incoming:[...s.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:[...s.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:[...s.deployments()].map(e=>e.id),sourceLocation:c({element:s.id})}}),np=likec4Tool({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
1163
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:V().describe(`Element id (FQN)`),project:Zh},outputSchema:{id:V().describe(`Element id (FQN)`),kind:V().describe(`Element kind`),name:V().describe(`Element name`),title:V(),description:V().nullable(),technology:V().nullable(),tags:H(V()),project:V(),metadata:Lr(Hr([V(),H(V())])),links:H(W({title:V().nullable().describe(`Optional link title`),url:V().describe(`Link URL`),relative:V().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:V(),color:V(),children:H(V()).describe(`Children of this element (Array of FQNs)`),defaultView:V().nullable().describe(`Name of the default view of this element`),includedInViews:Qh.describe(`Views that include this element`),relationships:W({incoming:H(W({source:W({id:V(),title:V(),kind:V()}).describe(`Source element of this relationship`),kind:V().nullable().describe(`Relationship kind`),target:V().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:H(W({source:V().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:W({id:V(),title:V(),kind:V()}).describe(`Target element of this relationship`),kind:V().nullable().describe(`Relationship kind`),title:V().nullable().describe(`Relationship title`),description:V().nullable().describe(`Relationship description`),technology:V().nullable().describe(`Relationship technology`),tags:H(V()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:H(V()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:Xh}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.id);invariant(s,`Element "${t.id}" not found in project "${r}"`);let c=mkLocate(e,r);return{id:s.id,name:s.name,kind:s.kind,title:s.title,description:s.description.text,technology:s.technology,tags:[...s.tags],project:r,metadata:s.getMetadata(),links:(s.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:s.shape,color:s.color,children:[...s.children()].map(e=>e.id),defaultView:s.defaultView?.id||null,includedInViews:includedInViews(s.views()),relationships:{incoming:[...s.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:[...s.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:[...s.deployments()].map(e=>e.id),sourceLocation:c({element:s.id})}}),xg=likec4Tool({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
1163
1164
  Request:
1164
1165
  - project: string (optional) — project id. Defaults to "default" if omitted.
1165
1166
 
@@ -1250,7 +1251,7 @@ Example response:
1250
1251
  }
1251
1252
  ]
1252
1253
  }
1253
- `,inputSchema:{project:Mf},outputSchema:{title:V(),folder:V(),sources:H(V()),config:kf.describe(`Project configuration`),specification:W({elementKinds:H(V()),relationshipKinds:H(V()),deploymentKinds:H(V()),tags:H(V()),metadataKeys:H(V())}),elements:H(W({id:V(),kind:V(),title:V(),tags:H(V())})).describe(`List of elements in the project`),deployments:H(Jr(`type`,[W({type:Ur(`deployment-node`),id:V().describe(`Node ID`),kind:V().describe(`Deployment node kind`),title:V().describe(`Node title`),tags:H(V())}),W({type:Ur(`deployed-instance`),id:V().describe(`Node ID`),title:V().describe(`Node title`),tags:H(V()),referencedElementId:V().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:H(W({id:V(),title:V(),type:Zr([`element`,`deployment`,`dynamic`])}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=e.project(r),c=await e.computedModel(r);return{title:s.title,folder:s.folder.fsPath,sources:s.documents?.map(e=>e.fsPath)??[],config:serializeConfig(s.config),specification:{elementKinds:d(c.specification.elements),relationshipKinds:d(c.specification.relationships),deploymentKinds:d(c.specification.deployments),tags:[...c.tags],metadataKeys:c.specification.metadataKeys??[]},elements:[...c.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...c.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:[...c.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),modelRef=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,rp=Jr(`type`,[W({type:Ur(`element`),id:V().describe(`Node ID`),elementId:V().describe(`Element ID (FQN)`),kind:V().describe(`Element kind`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),children:H(V()).describe(`Children nodes, array of node IDs`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())}),W({type:Ur(`deployment-node`),id:V().describe(`Node ID`),deploymentId:V().describe(`Deployment entity ID (FQN)`),kind:V().describe(`Deployment kind`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),children:H(V()).describe(`Children nodes, array of node IDs`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())}),W({type:Ur(`deployed-instance`),id:V().describe(`Node ID`),deploymentId:V().describe(`Deployment entity ID (FQN)`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),referencedElement:W({id:V().describe(`Element ID (FQN)`),kind:V().describe(`Element kind`),title:V().describe(`Element title`)}),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())})]),ip=likec4Tool({name:`read-view`,description:`
1254
+ `,inputSchema:{project:Zh},outputSchema:{title:V(),folder:V(),sources:H(V()),config:Jh.describe(`Project configuration`),specification:W({elementKinds:H(V()),relationshipKinds:H(V()),deploymentKinds:H(V()),tags:H(V()),metadataKeys:H(V())}),elements:H(W({id:V(),kind:V(),title:V(),tags:H(V())})).describe(`List of elements in the project`),deployments:H(Vr(`type`,[W({type:Ir(`deployment-node`),id:V().describe(`Node ID`),kind:V().describe(`Deployment node kind`),title:V().describe(`Node title`),tags:H(V())}),W({type:Ir(`deployed-instance`),id:V().describe(`Node ID`),title:V().describe(`Node title`),tags:H(V()),referencedElementId:V().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:H(W({id:V(),title:V(),type:Wr([`element`,`deployment`,`dynamic`])}))}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=e.project(r),c=await e.computedModel(r);return{title:s.title,folder:s.folder.fsPath,sources:s.documents?.map(e=>e.fsPath)??[],config:serializeConfig(s.config),specification:{elementKinds:u(c.specification.elements),relationshipKinds:u(c.specification.relationships),deploymentKinds:u(c.specification.deployments),tags:[...c.tags],metadataKeys:c.specification.metadataKeys??[]},elements:[...c.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...c.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:[...c.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),modelRef=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Sg=Vr(`type`,[W({type:Ir(`element`),id:V().describe(`Node ID`),elementId:V().describe(`Element ID (FQN)`),kind:V().describe(`Element kind`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),children:H(V()).describe(`Children nodes, array of node IDs`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())}),W({type:Ir(`deployment-node`),id:V().describe(`Node ID`),deploymentId:V().describe(`Deployment entity ID (FQN)`),kind:V().describe(`Deployment kind`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),children:H(V()).describe(`Children nodes, array of node IDs`),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())}),W({type:Ir(`deployed-instance`),id:V().describe(`Node ID`),deploymentId:V().describe(`Deployment entity ID (FQN)`),title:V().describe(`Node title`),description:V().nullable(),technology:V().nullable(),referencedElement:W({id:V().describe(`Element ID (FQN)`),kind:V().describe(`Element kind`),title:V().describe(`Element title`)}),shape:V().describe(`Rendered shape`),color:V().describe(`Rendered color`),tags:H(V())})]),Cg=likec4Tool({name:`read-view`,description:`
1254
1255
  Read detailed information about a LikeC4 view.
1255
1256
 
1256
1257
  Request:
@@ -1298,7 +1299,7 @@ Example response:
1298
1299
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
1299
1300
  }
1300
1301
  }
1301
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:V().describe(`View id (name)`),project:Mf},outputSchema:{id:V(),type:Zr([`element`,`deployment`,`dynamic`]).describe(`View type`),title:V(),description:V().nullable(),tags:H(V()),project:V(),nodes:H(rp),edges:H(W({source:V().describe(`Source node`),target:V().describe(`Target node`),label:V().nullable(),description:V().nullable(),technology:V().nullable(),tags:H(V())})).describe(`Edge represents relationship between nodes`),sourceLocation:jf}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=e.project(r),c=(await e.computedModel(r)).findView(t.viewId);if(!c)throw Error(`View with ID '${t.viewId}' not found in project ${s.id}`);let u=mkLocate(e,s.id);return{id:c.id,type:c.$view._type,title:c.title??c.id,description:c.description.text,tags:[...c.tags],project:s.id,nodes:[...c.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=>modelRef(e)??[])}:[]}),edges:[...c.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:u({view:c.id})}}),ap=H(Jr(`type`,[W({type:Ur(`element`),project:V().describe(`Project ID`),id:V().describe(`Element ID (FQN)`),name:V().describe(`Element name`),kind:V(),title:V(),technology:V().nullable(),shape:V(),includedInViews:Nf,metadata:Wr(Yr([V(),H(V())])),tags:H(V())}),W({type:Ur(`deployment-node`),project:V().describe(`Project ID`),id:V().describe(`Deployment ID (FQN)`),name:V().describe(`Deployment name`),kind:V(),title:V(),technology:V().nullable(),shape:V(),includedInViews:Nf,metadata:Wr(Yr([V(),H(V())])),tags:H(V())})])),op=likec4Tool({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1302
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:V().describe(`View id (name)`),project:Zh},outputSchema:{id:V(),type:Wr([`element`,`deployment`,`dynamic`]).describe(`View type`),title:V(),description:V().nullable(),tags:H(V()),project:V(),nodes:H(Sg),edges:H(W({source:V().describe(`Source node`),target:V().describe(`Target node`),label:V().nullable(),description:V().nullable(),technology:V().nullable(),tags:H(V())})).describe(`Edge represents relationship between nodes`),sourceLocation:Xh}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=e.project(r),c=(await e.computedModel(r)).findView(t.viewId);if(!c)throw Error(`View with ID '${t.viewId}' not found in project ${s.id}`);let u=mkLocate(e,s.id);return{id:c.id,type:c.$view._type,title:c.title??c.id,description:c.description.text,tags:[...c.tags],project:s.id,nodes:[...c.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=>modelRef(e)??[])}:[]}),edges:[...c.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:u({view:c.id})}}),wg=H(Vr(`type`,[W({type:Ir(`element`),project:V().describe(`Project ID`),id:V().describe(`Element ID (FQN)`),name:V().describe(`Element name`),kind:V(),title:V(),technology:V().nullable(),shape:V(),includedInViews:Qh,metadata:Lr(Hr([V(),H(V())])),tags:H(V())}),W({type:Ir(`deployment-node`),project:V().describe(`Project ID`),id:V().describe(`Deployment ID (FQN)`),name:V().describe(`Deployment name`),kind:V(),title:V(),technology:V().nullable(),shape:V(),includedInViews:Qh,metadata:Lr(Hr([V(),H(V())])),tags:H(V())})])),Tg=likec4Tool({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1302
1303
  Search LikeC4 elements and deployment nodes across all projects.
1303
1304
 
1304
1305
  Query syntax (case-insensitive):
@@ -1353,7 +1354,7 @@ Example response:
1353
1354
  }
1354
1355
  ]
1355
1356
  }
1356
- `,inputSchema:{search:V().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:U(),found:ap}})(async(e,t)=>{let r=e.projects(),s=[],c=t.search.toLowerCase(),predicate;c.startsWith(`kind:`)?(c=c.slice(5),vf.debug(`search by kind: {search}`,{search:c}),predicate=e=>e.kind.toLowerCase()===c):c.startsWith(`shape:`)?(c=c.slice(6),vf.debug(`search by shape: {search}`,{search:c}),predicate=e=>e.shape.toLowerCase()===c):c.startsWith(`meta:`)?(c=c.slice(5),vf.debug(`search by metadata: {search}`,{search:c}),predicate=e=>!!e.getMetadata(c)):c.startsWith(`#`)?(c=c.slice(1),vf.debug(`search by tag: {search}`,{search:c}),predicate=e=>e.tags.some(e=>e.toLowerCase().includes(c))):(vf.debug(`search by id/title: {search}`,{search:c}),predicate=e=>e.id.toLowerCase().includes(c)||e.title.toLowerCase().includes(c));for(let t of r)try{let r=await e.computedModel(t.id);for(let e of ifilter(r.elements(),e=>!e.imported&&predicate(e)))s.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:includedInViews(e.views())});for(let e of ifilter(r.deployment.nodes(),predicate))s.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:includedInViews(e.views())})}catch(e){vf.error(`Error searching in project ${t.id}:`,{error:e})}return{total:s.length,found:s.slice(0,20)}}),sp=W({id:V().describe(`Element id (FQN)`),name:V().describe(`Element name`),kind:V().describe(`Element kind`),title:V().describe(`Human-readable title`),depth:U().describe(`Depth relative to the root element (1 = direct child)`),tags:H(V()).describe(`Assigned tags`),metadata:Wr(Yr([V(),H(V())])).describe(`Element metadata`),childCount:U().describe(`Number of direct children`),incomingCount:U().describe(`Number of incoming relationships`),outgoingCount:U().describe(`Number of outgoing relationships`)}),cp=likec4Tool({name:`subgraph-summary`,description:`
1357
+ `,inputSchema:{search:V().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:U(),found:wg}})(async(e,t)=>{let r=e.projects(),s=[],c=t.search.toLowerCase(),predicate;c.startsWith(`kind:`)?(c=c.slice(5),Lh.debug(`search by kind: {search}`,{search:c}),predicate=e=>e.kind.toLowerCase()===c):c.startsWith(`shape:`)?(c=c.slice(6),Lh.debug(`search by shape: {search}`,{search:c}),predicate=e=>e.shape.toLowerCase()===c):c.startsWith(`meta:`)?(c=c.slice(5),Lh.debug(`search by metadata: {search}`,{search:c}),predicate=e=>!!e.getMetadata(c)):c.startsWith(`#`)?(c=c.slice(1),Lh.debug(`search by tag: {search}`,{search:c}),predicate=e=>e.tags.some(e=>e.toLowerCase().includes(c))):(Lh.debug(`search by id/title: {search}`,{search:c}),predicate=e=>e.id.toLowerCase().includes(c)||e.title.toLowerCase().includes(c));for(let t of r)try{let r=await e.computedModel(t.id);for(let e of ifilter(r.elements(),e=>!e.imported&&predicate(e)))s.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:includedInViews(e.views())});for(let e of ifilter(r.deployment.nodes(),predicate))s.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:includedInViews(e.views())})}catch(e){Lh.error(`Error searching in project ${t.id}:`,{error:e})}return{total:s.length,found:s.slice(0,20)}}),Eg=W({id:V().describe(`Element id (FQN)`),name:V().describe(`Element name`),kind:V().describe(`Element kind`),title:V().describe(`Human-readable title`),depth:U().describe(`Depth relative to the root element (1 = direct child)`),tags:H(V()).describe(`Assigned tags`),metadata:Lr(Hr([V(),H(V())])).describe(`Element metadata`),childCount:U().describe(`Number of direct children`),incomingCount:U().describe(`Number of incoming relationships`),outgoingCount:U().describe(`Number of outgoing relationships`)}),Dg=likec4Tool({name:`subgraph-summary`,description:`
1357
1358
  Get a compact, table-friendly summary of all descendants of a parent element.
1358
1359
  Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
1359
1360
  Much more efficient than calling read-element for each descendant individually.
@@ -1419,7 +1420,7 @@ Example response:
1419
1420
  "truncated": false,
1420
1421
  "truncatedByDepth": false
1421
1422
  }
1422
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:V().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:U().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:H(V()).optional().describe(`If provided, only include these metadata keys in the response`),project:Mf},outputSchema:{root:W({id:V(),kind:V(),title:V(),childCount:U()}),descendants:H(sp),totalDescendants:U().describe(`Total number of descendants found`),truncated:Hr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Hr().describe(`True if deeper descendants exist beyond maxDepth`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.elementId);invariant(s,`Element "${t.elementId}" not found in project "${r}"`);let c=t.maxDepth,u=t.metadataKeys,d=[],p=0,m=!1,h=!1,g=[],_=[...s.children()];for(let e of _)g.push({element:e,depth:1});for(;g.length>0;){let{element:e,depth:t}=g.shift();if(t>c){h=!0;continue}p++;let r=[...e.children()];if(d.length<200){let s=e.getMetadata(),c=u?Object.fromEntries(u.filter(e=>e in s).map(e=>[e,s[e]])):s;d.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:c,childCount:r.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else m=!0;for(let e of r)g.push({element:e,depth:t+1})}return{root:{id:s.id,kind:s.kind,title:s.title,childCount:_.length},descendants:d,totalDescendants:p,truncated:m,truncatedByDepth:h}});function createMCPServer(e){let t=new Qr({name:`LikeC4`,version:yf},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1423
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:V().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:U().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:H(V()).optional().describe(`If provided, only include these metadata keys in the response`),project:Zh},outputSchema:{root:W({id:V(),kind:V(),title:V(),childCount:U()}),descendants:H(Eg),totalDescendants:U().describe(`Total number of descendants found`),truncated:Fr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Fr().describe(`True if deeper descendants exist beyond maxDepth`)}})(async(e,t)=>{let r=e.projectsManager.ensureProjectId(t.project),s=(await e.computedModel(r)).findElement(t.elementId);invariant(s,`Element "${t.elementId}" not found in project "${r}"`);let c=t.maxDepth,u=t.metadataKeys,d=[],p=0,m=!1,h=!1,g=[],_=[...s.children()];for(let e of _)g.push({element:e,depth:1});for(;g.length>0;){let{element:e,depth:t}=g.shift();if(t>c){h=!0;continue}p++;let r=[...e.children()];if(d.length<200){let s=e.getMetadata(),c=u?Object.fromEntries(u.filter(e=>e in s).map(e=>[e,s[e]])):s;d.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:c,childCount:r.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else m=!0;for(let e of r)g.push({element:e,depth:t+1})}return{root:{id:s.id,kind:s.kind,title:s.title,childCount:_.length},descendants:d,totalDescendants:p,truncated:m,truncatedByDepth:h}});function createMCPServer(e){let t=new Gr({name:`LikeC4`,version:Rh},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1423
1424
 
1424
1425
  Conventions:
1425
1426
  - All tools are read-only and idempotent.
@@ -1452,4 +1453,4 @@ Instructions:
1452
1453
  - If response returns "sourceLocation", provide link to this location in the editor
1453
1454
 
1454
1455
  Full documentation: https://likec4.dev/llms-full.txt
1455
- `,enforceStrictCapabilities:!0,capabilities:{completions:{},tools:{},logging:{},prompts:{},resources:{}}});return t.server.onerror=e=>{la.error(loggable(e))},N(t,setMcpServerCtx,Uf,np,tp,ep,ip,op,Hf,zf,He(Yf,Zf,$f,Gf,qf,Kf),He(Ff,Rf,cp),He(applySemanticLayoutPrompt,applySemanticLayoutTool),projectResource)}var StdioLikeC4MCPServer=class{services;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||(vf.info(`Starting MCP stdio server`),this._mcp=createMCPServer(this.services),setMcpServerCtx(this._mcp),this.transport=new Gr,await this._mcp.connect(this.transport),vf.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{vf.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0,setMcpServerCtx(void 0)}}};async function createHonoApp(e){let t=new $r;t.use(`*`,_r({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 r=e();setMcpServerCtx(r);let s=new mr({eventStore:new br({})});return t.all(`/mcp`,async e=>(r.isConnected()||await r.connect(s),await s.handleRequest(e))),t.notFound(e=>(vf.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)=>(vf.error(loggable(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function startServer(e){let{factory:t,port:r}=e,s=await createHonoApp(t);return new Promise((e,t)=>{let c=ei({fetch:s.fetch,hostname:`0.0.0.0`,port:r}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{c.removeListener(`error`,t),e(c.unref())})})}var StreamableLikeC4MCPServer=class{services;_port;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()}vf.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await startServer({factory:()=>createMCPServer(this.services),port:e}),vf.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(vf.info(`Stopping MCP server`),this.server=void 0,setMcpServerCtx(void 0),new Promise(t=>{e.close(e=>{e?vf.error(`Failed to stop MCP server`,{err:e}):vf.info(`MCP server stopped`),t()})})):(vf.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};async function initLikeC4MCP(e){let t=Ki(e,{workspacePath:`.`,mcp:`stdio`,graphviz:`wasm`,watch:!0,throwIfInvalid:!1,configureLogger:!0});t.configureLogger&&(configureLanguageServerLogger({useStdErr:t.mcp===`stdio`,colors:uf.isColorSupported&&t.mcp!==`stdio`,logLevel:hi?`debug`:`info`}),process.on(`uncaughtException`,e=>{vf.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{vf.error(`unhandledRejection`,{err:e})}));let r=ai(t.workspacePath);vf.info`Loading LikeC4 from workspace: ${r}`;let s=await fromWorkspace(r,{graphviz:t.graphviz,manualLayouts:!0,configureLogger:!1,watch:t.watch,throwIfInvalid:t.throwIfInvalid}),c=setLanguageServicesCtx(s.languageServices);return{server:t.mcp===`stdio`?new StdioLikeC4MCPServer(c):new StreamableLikeC4MCPServer(c,t.mcp.port),likec4:s}}async function startLikeC4MCP(e){let t=await initLikeC4MCP(e);return await t.server.start(),t}export{startLikeC4MCP as n,vf as r,initLikeC4MCP as t};
1456
+ `,enforceStrictCapabilities:!0,capabilities:{completions:{},tools:{},logging:{},prompts:{},resources:{}}});return t.server.onerror=e=>{xa.error(loggable(e))},k(t,setMcpServerCtx,cg,xg,bg,yg,Cg,Tg,sg,ig,qe(mg,gg,vg,ug,fg,dg),qe(eg,rg,Dg),qe(applySemanticLayoutPrompt,applySemanticLayoutTool),projectResource)}var StdioLikeC4MCPServer=class{services;options;transport=void 0;_mcp=void 0;constructor(e,t={}){this.services=e,this.options=t}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(){if(!this.transport){Lh.info(`Starting MCP stdio server`),this._mcp=createMCPServer(this.services),setMcpServerCtx(this._mcp),this.transport=new Rr(this.options.stdin,this.options.stdout);try{await this._mcp.connect(this.transport)}catch(e){throw await this.stop(),e}Lh.info(`LikeC4 MCP Server running on stdio`)}}async stop(){if(this.transport)try{Lh.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0,setMcpServerCtx(void 0)}}};async function createHonoApp(e){let t=new Kr;t.use(`*`,fr({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 r=e();setMcpServerCtx(r);let s=new ur({eventStore:new hr({})});return t.all(`/mcp`,async e=>(r.isConnected()||await r.connect(s),await s.handleRequest(e))),t.notFound(e=>(Lh.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)=>(Lh.error(loggable(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function startServer(e){let{factory:t,port:r}=e,s=await createHonoApp(t);return new Promise((e,t)=>{let c=qr({fetch:s.fetch,hostname:`0.0.0.0`,port:r}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{c.removeListener(`error`,t),e(c.unref())})})}var StreamableLikeC4MCPServer=class{services;_port;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()}Lh.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await startServer({factory:()=>createMCPServer(this.services),port:e}),Lh.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(Lh.info(`Stopping MCP server`),this.server=void 0,setMcpServerCtx(void 0),new Promise(t=>{e.close(e=>{e?Lh.error(`Failed to stop MCP server`,{err:e}):Lh.info(`MCP server stopped`),t()})})):(Lh.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};async function initLikeC4MCP(e){let t=Qi(e,{workspacePath:`.`,mcp:`stdio`,graphviz:`wasm`,watch:!0,throwIfInvalid:!1,configureLogger:!0});t.configureLogger&&(configureLanguageServerLogger({useStdErr:t.mcp===`stdio`,colors:Oh.isColorSupported&&t.mcp!==`stdio`,logLevel:pi?`debug`:`info`}),process.on(`uncaughtException`,e=>{Lh.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{Lh.error(`unhandledRejection`,{err:e})}));let r=Qr(t.workspacePath);Lh.info`Loading LikeC4 from workspace: ${r}`;let s=await fromWorkspace(r,{graphviz:t.graphviz,manualLayouts:!0,configureLogger:!1,watch:t.watch,throwIfInvalid:t.throwIfInvalid}),c=setLanguageServicesCtx(s.languageServices);return{server:t.mcp===`stdio`?new StdioLikeC4MCPServer(c,t.stdio):new StreamableLikeC4MCPServer(c,t.mcp.port),likec4:s}}async function startLikeC4MCP(e){let t=e?.mcp===void 0||e.mcp===`stdio`?e?.stdio?.stdin??process.stdin:void 0,r,s=!1,c=t?t.readableEnded||t.destroyed:!1,u,cleanup=async()=>{let e=r;e&&(u??=(async()=>{try{await e.server.stop()}finally{try{await e.likec4.dispose()}finally{setLanguageServicesCtx(void 0)}}})(),await u)};function stopObservingStdin(){t&&(t.off(`end`,onStdinClosed),t.off(`close`,onStdinClosed))}function onStdinClosed(){c=!0,stopObservingStdin(),s&&cleanup().catch(e=>{Lh.error(`Failed to stop MCP stdio server after stdin closed`,{err:e})})}t&&!c&&(t.once(`end`,onStdinClosed),t.once(`close`,onStdinClosed),c=t.readableEnded||t.destroyed);try{if(r=await initLikeC4MCP(e),r.server instanceof StdioLikeC4MCPServer){if(c)return stopObservingStdin(),await cleanup(),r;await r.server.start(),s=!0,c&&await cleanup()}else await r.server.start();return r}catch(e){if(stopObservingStdin(),r)try{await cleanup()}catch(e){Lh.error(`Failed to clean up MCP stdio server after start error`,{err:e})}throw e}}export{startLikeC4MCP as n,Lh as r,initLikeC4MCP as t};