@likec4/mcp 1.56.0 → 1.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/libs/@hono/mcp.mjs +33 -8
- package/dist/chunks/libs/@hono/node-server.mjs +1 -1
- package/dist/chunks/libs/@modelcontextprotocol/sdk.mjs +7 -7
- package/dist/chunks/libs/@radix-ui/colors.mjs +1 -1
- package/dist/chunks/libs/@ts-graphviz/ast.mjs +3 -0
- package/dist/chunks/libs/@ts-graphviz/core.mjs +1 -0
- package/dist/chunks/libs/chevrotain.mjs +2 -2
- package/dist/chunks/libs/chroma-js.mjs +2 -2
- package/dist/chunks/libs/fdir.mjs +1 -1
- package/dist/chunks/libs/graphology-dag.mjs +1 -1
- package/dist/chunks/libs/langium.mjs +12 -9
- package/dist/chunks/libs/mdast-util-find-and-replace.mjs +1 -1
- package/dist/chunks/libs/merge-error-cause.mjs +1 -1
- package/dist/chunks/libs/mnemonist.mjs +1 -1
- package/dist/chunks/libs/remeda.mjs +1 -1
- package/dist/chunks/libs/ts-graphviz.mjs +1 -4
- package/dist/chunks/libs/unctx.mjs +1 -0
- package/dist/chunks/src.mjs +294 -86
- package/package.json +20 -18
package/dist/chunks/src.mjs
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import{c as e,i as t,r as n}from"./rolldown-runtime.mjs";import{t as r}from"./libs/@radix-ui/colors.mjs";import{$ as i,A as a,B as o,C as s,D as c,E as l,F as u,G as d,H as f,I as p,J as m,K as h,L as g,M as _,N as v,O as y,P as ee,Q as te,R as ne,S as b,T as re,U as x,V as ie,W as ae,X as oe,Y as se,Z as ce,_ as S,_t as le,a as C,at as w,b as ue,c as de,ct as T,d as fe,dt as pe,et as E,f as me,ft as he,g as ge,gt as _e,h as ve,ht as ye,i as be,it as xe,j as Se,k as Ce,l as we,lt as Te,m as Ee,mt as De,n as Oe,nt as ke,o as Ae,ot as je,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 Be,u as Ve,ut as D,v as He,w as Ue,x as We,y as Ge,z as Ke}from"./libs/remeda.mjs";import{t as qe}from"./libs/natural-compare-lite.mjs";import{t as Je}from"./libs/chroma-js.mjs";import{n as Ye,t as Xe}from"./libs/graphology-dag.mjs";import{a as Ze,i as Qe,n as $e,o as et,r as tt,s as nt,t as O}from"./libs/mnemonist.mjs";import{t as rt}from"./libs/defu.mjs";import{t as it}from"./libs/ohash.mjs";import{n as at}from"./libs/hast-util-sanitize.mjs";import{t as ot}from"./libs/rehype-sanitize.mjs";import{t as st}from"./libs/rehype-stringify.mjs";import{c as ct,t as lt}from"./libs/mdast-util-from-markdown.mjs";import{t as ut}from"./libs/remark-gfm.mjs";import{t as dt}from"./libs/remark-github-blockquote-alert.mjs";import{t as ft}from"./libs/remark-parse.mjs";import{t as pt}from"./libs/remark-rehype.mjs";import{t as mt}from"./libs/unified.mjs";import{n as ht,t as gt}from"./libs/immer.mjs";import{a as _t,i as vt,n as yt,r as bt,t as xt}from"./libs/@logtape/logtape.mjs";import{n as St,t as Ct}from"./libs/merge-error-cause.mjs";import{t as wt}from"./libs/safe-stringify.mjs";import{a as Tt,i as k,n as Et,r as Dt,t as Ot}from"./libs/@lume/kiwi.mjs";import{n as kt,r as At,t as A}from"./libs/ts-graphviz.mjs";import{t as jt}from"./libs/word-wrap.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-limit.mjs";import{t as Lt}from"./libs/p-queue.mjs";import{n as Rt,t as zt}from"./libs/nano-spawn.mjs";import{t as Bt}from"./libs/which.mjs";import{$ as Vt,A as j,B as Ht,C as Ut,D as Wt,E as Gt,F as Kt,G as qt,H as Jt,I as M,J as Yt,K as Xt,L as N,M as Zt,N as Qt,O as $t,P as en,Q as tn,R as nn,S as rn,T as an,U as on,V as sn,W as cn,X as ln,Y as un,Z as dn,_ as fn,a as pn,at as mn,b as hn,c as gn,ct as _n,d as vn,dt as yn,et as bn,f as xn,ft as Sn,g as Cn,h as wn,i as Tn,it as P,j as En,k as Dn,l as On,lt as kn,m as An,mt as jn,n as Mn,nt as Nn,o as Pn,ot as Fn,p as In,pt as Ln,q as Rn,r as zn,rt as Bn,s as Vn,st as Hn,t as Un,tt as Wn,u as Gn,ut as Kn,v as qn,w as Jn,x as Yn,y as Xn,z as Zn}from"./libs/langium.mjs";import{t as Qn}from"./libs/json5.mjs";import{Y as F,n as $n,r as er,t as tr}from"./libs/@hono/mcp.mjs";import{n as nr,t as rr}from"./libs/fdir.mjs";import{t as ir}from"./libs/chokidar.mjs";import{t as ar}from"./libs/pretty-ms.mjs";import{t as or}from"./libs/pathe.mjs";import{a as sr,c as cr,d as lr,i as ur,l as dr,n as fr,o as pr,r as mr,s as hr,t as gr,u as _r}from"./libs/ufo.mjs";import{t as vr}from"./libs/p-timeout.mjs";import{t as yr}from"./libs/strip-indent.mjs";import{n as br,t as xr}from"./libs/unstorage.mjs";import{t as Sr}from"./libs/tinyrainbow.mjs";import{a as Cr,c as I,d as wr,f as Tr,i as Er,l as Dr,n as L,o as Or,p as kr,r as Ar,s as R,t as jr,u as z}from"./libs/@modelcontextprotocol/sdk.mjs";import{t as Mr}from"./libs/hono.mjs";import{t as Nr}from"./libs/@hono/node-server.mjs";import{basename as Pr,dirname as Fr,relative as Ir,resolve as Lr}from"node:path";import{cwd as Rr}from"node:process";import{Graphviz as zr}from"@hpcc-js/wasm-graphviz";import*as Br from"node:fs/promises";import{unlink as Vr,writeFile as Hr}from"node:fs/promises";import Ur from"node:os";import{mkdirSync as Wr,statSync as Gr}from"node:fs";import{isColorSupported as Kr,isDevelopment as qr}from"std-env";import{bundleRequire as Jr}from"bundle-require";import{formatMessagesSync as Yr}from"esbuild";const Xr={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},Zr={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},Qr={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},$r={primary:Xr,blue:Xr,secondary:Zr,sky:Zr,muted:Qr,slate:Qr,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`}},ei={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},ti={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},ni={line:`#3b82f6`,labelBg:`#172554`,label:`#eff5fd`},ri={line:`#0ea5e9`,labelBg:`#082f49`,label:`#d4f2ff`},ii={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:ni,gray:ei,green:{line:`#15803d`,labelBg:`#052e16`,label:`#bbfcd3`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#cbd0fd`},muted:ti,primary:ni,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#fcd9d2`},secondary:ri,sky:ri,slate:ti},ai={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=r();const si=[`xs`,`sm`,`md`,`lg`,`xl`],ci=[`left`,`right`,`top`,`bottom`],li=[`solid`,`dashed`,`dotted`,`none`],ui=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],di=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],fi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],pi={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 pi}const mi={colors:di.reduce((e,t)=>(e[t]={elements:$r[t],relationships:ii[t]},e),{}),...ai};var hi=e(qe(),1);function compareNatural(e,t){return e===t?0:v(e)?v(t)?(0,hi.default)(e,t):1:v(t)?-1:0}function compareNaturalHierarchically(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,hi.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function nonNullable(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function invariant(e,t){if(!e)throw Error(t??`Invariant failed`)}function nonexhaustive(e){throw Error(`NonExhaustive value: ${e}`)}function assignTagColors(e){let t=[],n=[];for(let[r,i]of je(e))_(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return D(n,fe(compareNatural),y((e,t)=>({tag:e,spec:{color:nonNullable(fi[t%fi.length])}})),he(t),fe((e,t)=>compareNatural(e.tag,t.tag)),ge(S(`tag`),S(`spec`)))}function commonHead(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,D(ze(e,t),Le(([e,t])=>n(e,t)),y(([e,t])=>e)))}function exact(e){return Ue(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[B]===t}const B=`_stage`,gi=`_type`,_i=`_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(ie(e))return null;let t=v(e)?e:e.txt??e.md;return _(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 n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}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 V;(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(v(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})(V||={});let H;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=isModelRef;function isDeploymentRef(e){return`ref`in e&&V.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})(H||={});let yi;(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})(yi||={});let bi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return yi.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return H.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelation(e){return yi.is(e)||yi.isWhere(e)||yi.isCustom(e)}e.isRelation=isRelation})(bi||={});let U;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&V.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})(U||={});let W;(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})(W||={});let xi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return W.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return U.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return U.is(e)||U.isWhere(e)||U.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelationExpr(e){return W.is(e)||W.isWhere(e)||W.isCustom(e)}e.isRelationExpr=isRelationExpr})(xi||={});function isDeploymentNode$1(e){return _(e.kind)&&!_(e.element)}t(isDeploymentNode$1,`isDeploymentNode`);function computeCompoundColorValues(e,t){let n=t??6,r=Je(e.fill),i=Je(e.stroke),a=r.luminance()>.8,o=D(ze(Je.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),Je.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),y(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return invariant(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Si={theme:mi,defaults:{color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}}};var Ci=class LikeC4Styles{theme;defaults;static DEFAULT=new LikeC4Styles(Si);static from(e,t){if(!e&&!t)return this.DEFAULT;let{customCss:n,theme:r,defaults:i}={...e},a=rt({theme:r},{defaults:{...i}},{theme:{colors:{...t}}},Si);return ie(n?.content)&&m(a,Si)?this.DEFAULT:new LikeC4Styles(a,n)}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 $e.default(e=>new O.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(pi[e]).elements:this.computeFrom(e).elements}};function ensureSizes({size:e,padding:t,textSize:n,iconSize:r,...i},a=Si.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}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(v(e.tag)||`eq`in e.tag){let t=v(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(v(e.kind)||`eq`in e.kind){let t=v(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>g(e.kind)||e.kind!==t}case isMetadataEqual(e):{let{key:t,value:n}=e.metadata;if(n===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(v(n)||`eq`in n){let e=v(n)?n:n.eq;return n=>{if(!n.metadata)return!1;let r=n.metadata[t];return Array.isArray(r)?r.includes(e):r===e}}let r=n.neq;return e=>{if(!e.metadata)return!0;let n=e.metadata[t];return n==null?!0:Array.isArray(n)?!n.includes(r):n!==r}}case isNotOperator(e):return ne(whereOperatorAsPredicate(e.not));case isAndOperator(e):return _e(e.and.map(whereOperatorAsPredicate));case isOrOperator(e):return ye(e.or.map(whereOperatorAsPredicate));default:nonexhaustive(e)}}function participantIs(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function 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)&&_(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&&d(e.__parallel)}function isDynamicStepsSeries(e){return!!e&&`__series`in e&&d(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 wi=Symbol.for(`text`),Ti=Symbol.for(`html`);var Ei=class RichText{static mdcache=new Qe.default(500);static txtcache=new Qe.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,n){return memoizeProp(e,t,()=>RichText.from(n))}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,wi,()=>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,Ti,()=>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 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 n=asString(e);return t?asString(t).startsWith(n+`.`):e=>{let t=asString(e);return n.startsWith(t+`.`)}}function isSameHierarchy(e,t){if(!t)return t=>isSameHierarchy(e,t);let n=asString(e),r=asString(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}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 n=isString(e)?e:e.id,r=isString(t)?t:t.id;if(n===r)return 0;let i=hierarchyLevel(n),a=hierarchyLevel(r);if(isSameHierarchy(n,r))return Math.abs(i-a);let o=commonAncestor(n,r),s=o?hierarchyLevel(o):0;return i+a-(2*s+1)}function commonAncestor(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function ancestorsFqn(e){let t=e.split(`.`);if(t.pop(),!T(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 n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r: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 n=t;for(let t of e)t!==n&&isAncestor(t,n)&&(n=t);return n===t?null:n}function sortParentsFirst(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=findTopAncestor(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function sortNaturalByFqn(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>sortNaturalByFqn(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=compareNatural(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function getOrCreate(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function isIterable(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ifilter(e,t){let n=t??e;invariant(o(n));function*_filter(e){for(let t of e)n(t)&&(yield t)}return t?_filter(e):_filter}function ifind(e,t){let n=t??e;invariant(o(n));function _find(e){for(let t of e)if(n(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 n=t??e;invariant(o(n));function*_map(e){for(let t of e)yield n(t)}return t?_map(e):_map}function isome(e,t){let n=t??e;invariant(o(n));function _some(e){for(let t of e)if(n(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 n of e)t.has(n)||(t.add(n),yield n)}function memoizeProp(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function delay(...e){let t=100;return e.length===2?t=ve(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 n=commonAncestor(e.source.id,e.target.id),r=commonAncestor(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?compareFqnHierarchically(n,r):0;if(i!==0)return i;let a=compareFqnHierarchically(e.source.id,t.source.id);return a===0?compareFqnHierarchically(e.target.id,t.target.id):a};function union(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function intersection(e,...t){let n=new Set;if(e.size===0)return n;let r=T(t,2)?(0,et.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function difference(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function equals(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function symmetricDifference(e,t){return(0,et.symmetricDifference)(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 n of e)if(t.has(n))return!0;return!1}function objectHash(e){return invariant(typeof e==`object`&&Ke(e),`objectHash: value must be an object`),it(e)}function stringHash$1(e){let t=5381,n=e.length;invariant(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}t(stringHash$1,`stringHash`);function parser(){return mt().use(ft).use(ut).use(dt).use(pt,{allowDangerousHtml:!0}).use(ot,rt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`],protocols:{src:[`data`]}},at)).use(st,{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 n=t>0?e+(255-e)*t:e*(1+t);return Math.round(Math.max(0,Math.min(255,n)))})}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(),n=getColorPalette(t.startsWith(`#`)?t:Je(t).hex());return{elements:{fill:n.el_main,stroke:n.el_secondary,hiContrast:n.el_hiContrast,loContrast:n.el_loContrast},relationships:{line:n.rel_secondary,label:n.rel_hiContrast,labelBg:n.rel_main}}}function getColorPalette(e){let t=e,n=Je(t).darken(.8).hex(),r=getContrastedColorsAPCA(t),i=r.hiContrast,a=r.loContrast,o=t;return{el_main:t,el_secondary:n,el_hiContrast:i,el_loContrast:a,rel_main:o,rel_secondary:adjustToneHex(t,-.25),rel_hiContrast:getContrastedColorsAPCA(o).hiContrast}}function getContrastedColorsAPCA(e){let t=Je(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=Je.contrastAPCA(t,n),s=Je.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!m(n,i)||!m(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:Je(n.brighten(.4)).hex(),loContrast:n.hex()}:{hiContrast:Je(r.darken(.4)).hex(),loContrast:r.hex()}}const Di=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function applyCachedLayout(e,t){let{nodes:n,edges:r,hasManualLayout:i,...a}=e,o=new Map(n.map(e=>[e.id,e])),s=new Map(r.map(e=>[e.id,e])),c=t.nodes.map(e=>{let t=o.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),l=t.edges.map(e=>{let t=s.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints}}:e}),u={...t,...a,[B]:`layouted`,bounds:t.bounds,nodes:c,edges:l};return i?u[_i]=`auto`:delete u[_i],u}function buildElementNotations(e){return D(e,w(e=>!!e.notation),oe(S(`notation`)),l(He(oe(S(`shape`)),l(He(oe(S(`color`)),l(He(y(S(`kind`)),C())),je(),y(([e,t])=>({kinds:t,color:e})))),je(),E(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),je(),E(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),Ve(S(`shape`),S(`title`),[e=>e.kinds.length,`desc`]))}const changed=(e,t)=>e===t||g(e)&&g(t)?!1:!m(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],g(t.style.border)?delete e.style.border:e.style.border=t.style.border,p(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,g(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function autoApplyIcon(e,t,n){if(changed(t.icon??`none`,e.icon??`none`)){let r=_(e.icon)&&e.icon!==`none`;switch(!0){case r&&_(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(g(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&_(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function autoApplyIconStyles(e,t,n){let r=!0;return changed(e.style.iconColor,t.style.iconColor)&&(g(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),changed(e.style.iconSize,t.style.iconSize)&&(n?g(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),changed(e.style.iconPosition,t.style.iconPosition)&&(n?g(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}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,n){let r=!0;return changed(e.title,t.title)&&(n?e.title=t.title:r=!1),changed(e.description,t.description)&&(g(t.description)?delete e.description:n?e.description=patchMarkdownOrString(e.description,t.description):r=!1),changed(e.technology,t.technology)&&(g(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function autoApplyLabelsToCompound(e,t,n){return e.title=t.title,g(t.description)?delete e.description:e.description=patchMarkdownOrString(e.description,t.description),g(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 n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=applyNodesManualLayout(t.nodes,e.nodes,n),i=applyEdgesManualLayout(t.edges,e.edges,n),a=buildElementNotations(r);return ht(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[_i]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=gt(r),o.edges=gt(i),isDynamicView$1(e)&&o._type===`dynamic`&&(o.variant=e.variant),isElementView$1(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];T(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function applyNodesManualLayout(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),ht(e,r=>{autoApplyMetaAndStyles(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(changed(r.modelRef,t.modelRef)||changed(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),changed(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;changed(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),autoApplyIconStyles(r,t,s)||i.add(`label-changed`),autoApplyIcon(r,t,s&&o===a)||i.add(`label-changed`),(a?autoApplyLabelsToCompound:autoApplyLabelsToLeaf)(r,t,s)||i.add(`label-changed`),changed(r.notes,t.notes)&&(g(t.notes)?delete r.notes:r.notes=patchMarkdownOrString(r.notes,t.notes)),changed(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&symmetricDifference(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];T(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function applyEdgesManualLayout(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??D(r.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&r.delete(t.id),ht(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:changed(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default: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(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,changed(e.notes,t.notes)&&(g(e.notes)!==g(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,changed(ue(e,[`label`,`description`,`technology`,`labelBBox`]),ue(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),changed(e.label,t.label)&&(g(t.label)!==g(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),changed(e.description,t.description)&&(g(t.description)!==g(e.description)&&i.add(`label-changed`),t.description&&(r.description=patchMarkdownOrString(e.description,t.description))),changed(e.technology,t.technology)&&(g(t.technology)!==g(e.technology)&&i.add(`label-changed`),r.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 o=[...i];T(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function calcDriftsFromSnapshot(e,t){let{drifts:n,...r}=applyManualLayout(e,t);if(!n||n.length===0)return ht(e,e=>{delete e.drifts,e[_i]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),ht(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??D(o.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&o.delete(t.id),ht(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return ht(e,e=>{T(l,1)?e.drifts=l:delete e.drifts,e.nodes=gt(s),e.edges=gt(c),e[_i]=`auto`})}const parseStack=e=>e.split(`
|
|
2
|
-
`).map(e=>e.trim().replace(`file://`,``));function indent(e,t=2){e=Array.isArray(e)?e:e.split(`
|
|
1
|
+
import{c as e,i as t,r as n}from"./rolldown-runtime.mjs";import{t as r}from"./libs/@radix-ui/colors.mjs";import{$ as i,A as a,B as o,C as s,D as c,E as l,F as u,G as d,H as f,I as p,J as m,K as h,L as g,M as _,N as v,O as y,P as ee,Q as te,R as b,S as x,T as ne,U as S,V as re,W as C,X as ie,Y as ae,Z as oe,_ as w,_t as se,a as T,at as ce,b as le,c as ue,ct as de,d as fe,dt as E,et as pe,f as me,ft as he,g as ge,gt as _e,h as ve,ht as ye,i as be,it as xe,j as Se,k as Ce,l as we,lt as D,m as Te,mt as Ee,n as De,nt as Oe,o as ke,ot as O,p as Ae,pt as je,q as Me,r as Ne,rt as Pe,s as Fe,st as Ie,t as Le,tt as k,u as Re,ut as ze,v as Be,vt as Ve,w as He,x as Ue,y as We,z as Ge}from"./libs/remeda.mjs";import{t as Ke}from"./libs/natural-compare-lite.mjs";import{t as qe}from"./libs/chroma-js.mjs";import{a as Je,i as Ye,n as Xe,o as Ze,r as Qe,s as $e,t as A}from"./libs/mnemonist.mjs";import{n as et,t as tt}from"./libs/graphology-dag.mjs";import{t as nt}from"./libs/defu.mjs";import{t as rt}from"./libs/ohash.mjs";import{n as it}from"./libs/hast-util-sanitize.mjs";import{t as at}from"./libs/rehype-sanitize.mjs";import{t as ot}from"./libs/rehype-stringify.mjs";import{c as st,t as ct}from"./libs/mdast-util-from-markdown.mjs";import{t as lt}from"./libs/remark-gfm.mjs";import{t as ut}from"./libs/remark-github-blockquote-alert.mjs";import{t as dt}from"./libs/remark-parse.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/immer.mjs";import{a as gt,i as _t,n as vt,r as yt,t as bt}from"./libs/@logtape/logtape.mjs";import{n as xt,t as St}from"./libs/merge-error-cause.mjs";import{t as Ct}from"./libs/safe-stringify.mjs";import{a as wt,i as j,n as Tt,r as Et,t as Dt}from"./libs/@lume/kiwi.mjs";import{n as Ot,r as M,t as kt}from"./libs/ts-graphviz.mjs";import{t as At}from"./libs/word-wrap.mjs";import{n as jt,r as Mt,t as Nt}from"./libs/khroma.mjs";import{t as Pt}from"./libs/graphology.mjs";import{t as Ft}from"./libs/p-limit.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 N,G as Kt,H as P,I as qt,J as Jt,K as Yt,L as Xt,M as Zt,N as Qt,O as $t,P as en,Q as tn,R as nn,S as rn,T as an,U as on,V as F,W as sn,X as cn,Y as ln,Z as un,_ as dn,_t as fn,a as pn,at as mn,b as hn,c as gn,ct as _n,d as vn,dt as yn,et as bn,f as xn,ft as Sn,g as Cn,gt as wn,h as Tn,ht as En,i as Dn,it as On,j as kn,k as An,l as jn,lt as I,m as Mn,mt as Nn,n as Pn,nt as Fn,o as In,ot as Ln,p as Rn,pt as zn,q as Bn,r as Vn,rt as Hn,s as Un,st as Wn,t as Gn,tt as Kn,u as qn,ut as Jn,v as Yn,vt as Xn,w as Zn,x as Qn,y as $n,yt as er,z as tr}from"./libs/langium.mjs";import{t as nr}from"./libs/json5.mjs";import{$ as rr,Q as ir,X as ar,Y as L,at as or,ct as R,et as sr,it as cr,lt as lr,n as ur,nt as dr,ot as fr,r as pr,rt as mr,st as hr,t as gr,tt as _r,ut as vr,vt as yr}from"./libs/@hono/mcp.mjs";import{n as br,t as xr}from"./libs/fdir.mjs";import{t as Sr}from"./libs/chokidar.mjs";import{t as Cr}from"./libs/pretty-ms.mjs";import{t as wr}from"./libs/pathe.mjs";import{a as Tr,c as Er,d as Dr,i as Or,l as kr,n as Ar,o as jr,r as Mr,s as Nr,t as Pr,u as Fr}from"./libs/ufo.mjs";import{t as Ir}from"./libs/p-timeout.mjs";import{t as Lr}from"./libs/strip-indent.mjs";import{n as Rr,t as zr}from"./libs/unstorage.mjs";import{t as Br}from"./libs/tinyrainbow.mjs";import{t as Vr}from"./libs/unctx.mjs";import{a as Hr,c as Ur,d as Wr,f as z,h as Gr,i as B,l as V,m as Kr,n as qr,o as Jr,p as Yr,r as Xr,s as Zr,t as Qr,u as H}from"./libs/@modelcontextprotocol/sdk.mjs";import{t as $r}from"./libs/hono.mjs";import{t as ei}from"./libs/@hono/node-server.mjs";import{basename as ti,dirname as ni,relative as ri,resolve as ii}from"node:path";import{cwd as ai}from"node:process";import{Graphviz as oi}from"@hpcc-js/wasm-graphviz";import*as si from"node:fs/promises";import{unlink as ci,writeFile as li}from"node:fs/promises";import ui from"node:os";import{mkdirSync as di,statSync as fi}from"node:fs";import{isColorSupported as pi,isDevelopment as mi}from"std-env";import{bundleRequire as hi}from"bundle-require";import{formatMessagesSync as gi}from"esbuild";const _i={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},vi={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},yi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},bi={primary:_i,blue:_i,secondary:vi,sky:vi,muted:yi,slate:yi,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`}},xi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Si={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Ci={line:`#3b82f6`,labelBg:`#172554`,label:`#eff5fd`},wi={line:`#0ea5e9`,labelBg:`#082f49`,label:`#d4f2ff`},Ti={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Ci,gray:xi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#bbfcd3`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#cbd0fd`},muted:Si,primary:Ci,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#fcd9d2`},secondary:wi,sky:wi,slate:Si},Ei={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 Di=r();const Oi=[`xs`,`sm`,`md`,`lg`,`xl`],ki=[`left`,`right`,`top`,`bottom`],Ai=[`solid`,`dashed`,`dotted`,`none`],ji=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Mi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Ni=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Pi={tomato:Di.tomato.tomato9,grass:Di.grass.grass9,blue:Di.blue.blue9,ruby:Di.ruby.ruby9,orange:Di.orange.orange9,indigo:Di.indigo.indigo9,pink:Di.pink.pink9,teal:Di.teal.teal9,purple:Di.purple.purple9,amber:Di.amber.amber9,crimson:Di.crimson.crimson9,red:Di.red.red9,lime:Di.lime.lime9,yellow:Di.yellow.yellow9,violet:Di.violet.violet9};function isDefaultTagColor(e){return e in Pi}const Fi={colors:Mi.reduce((e,t)=>(e[t]={elements:bi[t],relationships:Ti[t]},e),{}),...Ei};var Ii=e(Ke(),1);function compareNatural(e,t){return e===t?0:v(e)?v(t)?(0,Ii.default)(e,t):1:v(t)?-1:0}function compareNaturalHierarchically(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Ii.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function nonNullable(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function invariant(e,t){if(!e)throw Error(t??`Invariant failed`)}function nonexhaustive(e){throw Error(`NonExhaustive value: ${e}`)}function assignTagColors(e){let t=[],n=[];for(let[r,i]of Ie(e))_(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return E(n,fe(compareNatural),y((e,t)=>({tag:e,spec:{color:nonNullable(Ni[t%Ni.length])}})),je(t),fe((e,t)=>compareNatural(e.tag,t.tag)),ge(w(`tag`),w(`spec`)))}function commonHead(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,E(Le(e,t),Fe(([e,t])=>n(e,t)),y(([e,t])=>e)))}function exact(e){return He(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[U]===t}const U=`_stage`,Li=`_type`,Ri=`_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(f(e))return null;let t=v(e)?e:e.txt??e.md;return _(t?.trim())?t:null}function Fqn(e,t){return t?t+`.`+e:e}const zi=`@group`;function isGroupElementKind(e){return e.kind===zi}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 n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}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 W;(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(v(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})(W||={});let G;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&W.isModelRef(e.ref)}e.isModelRef=isModelRef;function isDeploymentRef(e){return`ref`in e&&W.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})(G||={});let Bi;(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})(Bi||={});let Vi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return Bi.isWhere(e)}e.isRelationWhere=isRelationWhere;function isFqnExprWhere(e){return G.isWhere(e)}e.isFqnExprWhere=isFqnExprWhere;function isFqnExpr(e){return G.is(e)||G.isWhere(e)||G.isCustom(e)}e.isFqnExpr=isFqnExpr;function isRelation(e){return Bi.is(e)||Bi.isWhere(e)||Bi.isCustom(e)}e.isRelation=isRelation})(Vi||={});let K;(function(e){function isWildcard(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=isWildcard;function isModelRef(e){return`ref`in e&&W.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})(K||={});let q;(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})(q||={});let Hi;(function(e){function isWhere(e){return`where`in e}e.isWhere=isWhere;function isRelationWhere(e){return q.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 isRelationExpr(e){return q.is(e)||q.isWhere(e)||q.isCustom(e)}e.isRelationExpr=isRelationExpr})(Hi||={});function isDeploymentNode$1(e){return _(e.kind)&&!_(e.element)}t(isDeploymentNode$1,`isDeploymentNode`);function computeCompoundColorValues(e,t){let n=t??6,r=qe(e.fill),i=qe(e.stroke),a=r.luminance()>.8,o=E(Le(qe.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),qe.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),y(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return invariant(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Ui={theme:Fi,defaults:{color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}}};var Wi=class LikeC4Styles{config;customCss;theme;defaults;static DEFAULT=new LikeC4Styles(Ui);static from(e,t){if(!e&&!t)return this.DEFAULT;let{customCss:n,theme:r,defaults:i}={...e},a=nt({theme:r},{defaults:{...i}},{theme:{colors:{...t}}},Ui);return f(n?.content)&&ae(a,Ui)?this.DEFAULT:new LikeC4Styles(a,n)}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 Xe.default(e=>new A.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(!qe.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(Pi[e]).elements:this.computeFrom(e).elements}};function ensureSizes({size:e,padding:t,textSize:n,iconSize:r,...i},a=Ui.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}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(v(e.tag)||`eq`in e.tag){let t=v(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(v(e.kind)||`eq`in e.kind){let t=v(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>b(e.kind)||e.kind!==t}case isMetadataEqual(e):{let{key:t,value:n}=e.metadata;if(n===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(v(n)||`eq`in n){let e=v(n)?n:n.eq;return n=>{if(!n.metadata)return!1;let r=n.metadata[t];return Array.isArray(r)?r.includes(e):r===e}}let r=n.neq;return e=>{if(!e.metadata)return!0;let n=e.metadata[t];return n==null?!0:Array.isArray(n)?!n.includes(r):n!==r}}case isNotOperator(e):return Ge(whereOperatorAsPredicate(e.not));case isAndOperator(e):return se(e.and.map(whereOperatorAsPredicate));case isOrOperator(e):return _e(e.or.map(whereOperatorAsPredicate));default:nonexhaustive(e)}}function participantIs(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function 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)&&_(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&&h(e.__parallel)}function isDynamicStepsSeries(e){return!!e&&`__series`in e&&h(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 Gi=Symbol.for(`text`),Ki=Symbol.for(`html`);var qi=class RichText{static mdcache=new Ye.default(500);static txtcache=new Ye.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,n){return memoizeProp(e,t,()=>RichText.from(n))}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,Gi,()=>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,Ki,()=>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,n]=e;return _hasProp(t,n)}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 n=asString(e);return t?asString(t).startsWith(n+`.`):e=>{let t=asString(e);return n.startsWith(t+`.`)}}function isSameHierarchy(e,t){if(!t)return t=>isSameHierarchy(e,t);let n=asString(e),r=asString(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}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 n=isString(e)?e:e.id,r=isString(t)?t:t.id;if(n===r)return 0;let i=hierarchyLevel(n),a=hierarchyLevel(r);if(isSameHierarchy(n,r))return Math.abs(i-a);let o=commonAncestor(n,r),s=o?hierarchyLevel(o):0;return i+a-(2*s+1)}function commonAncestor(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function ancestorsFqn(e){let t=e.split(`.`);if(t.pop(),!D(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 n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r: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 n=t;for(let t of e)t!==n&&isAncestor(t,n)&&(n=t);return n===t?null:n}function sortParentsFirst(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=findTopAncestor(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function sortNaturalByFqn(e,t){if(!e||isString(e)){let t=e??`asc`;return e=>sortNaturalByFqn(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=compareNatural(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function getOrCreate(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function isIterable(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ifilter(e,t){let n=t??e;invariant(re(n));function*_filter(e){for(let t of e)n(t)&&(yield t)}return t?_filter(e):_filter}function ifind(e,t){let n=t??e;invariant(re(n));function _find(e){for(let t of e)if(n(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 n=t??e;invariant(re(n));function*_map(e){for(let t of e)yield n(t)}return t?_map(e):_map}function isome(e,t){let n=t??e;invariant(re(n));function _some(e){for(let t of e)if(n(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 n of e)t.has(n)||(t.add(n),yield n)}function memoizeProp(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function delay(...e){let t=100;return e.length===2?t=ve(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 n=commonAncestor(e.source.id,e.target.id),r=commonAncestor(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?compareFqnHierarchically(n,r):0;if(i!==0)return i;let a=compareFqnHierarchically(e.source.id,t.source.id);return a===0?compareFqnHierarchically(e.target.id,t.target.id):a},Ji=Ze.intersection,Yi=Ze.symmetricDifference;function union(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function intersection(e,...t){let n=new Set;if(e.size===0)return n;let r=D(t,2)?Ji(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function difference(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function equals(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function symmetricDifference(e,t){return Yi(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 n of e)if(t.has(n))return!0;return!1}function objectHash(e){return invariant(typeof e==`object`&&o(e),`objectHash: value must be an object`),rt(e)}function stringHash$1(e){let t=5381,n=e.length;invariant(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}t(stringHash$1,`stringHash`);function parser(){return pt().use(dt).use(lt).use(ut).use(ft,{allowDangerousHtml:!0}).use(at,nt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`],protocols:{src:[`data`]}},it)).use(ot,{allowDangerousHtml:!0})}function markdownToHtml(e){return(``+parser().processSync(e)).trim()}function markdownToText(e){return st(ct(e),{includeHtml:!1,includeImageAlt:!1})}function adjustToneRgb(e,t){return t=Math.max(-1,Math.min(1,t)),e.map(e=>{let n=t>0?e+(255-e)*t:e*(1+t);return Math.round(Math.max(0,Math.min(255,n)))})}function adjustToneHex(e,t){return qe(adjustToneRgb(qe(e).rgb(),t)).hex()}function computeColorValues(e){invariant(qe.valid(e),`Invalid color: ${e}`);let t=e.trim(),n=getColorPalette(t.startsWith(`#`)?t:qe(t).hex());return{elements:{fill:n.el_main,stroke:n.el_secondary,hiContrast:n.el_hiContrast,loContrast:n.el_loContrast},relationships:{line:n.rel_secondary,label:n.rel_hiContrast,labelBg:n.rel_main}}}function getColorPalette(e){let t=e,n=qe(t).darken(.8).hex(),r=getContrastedColorsAPCA(t),i=r.hiContrast,a=r.loContrast,o=t;return{el_main:t,el_secondary:n,el_hiContrast:i,el_loContrast:a,rel_main:o,rel_secondary:adjustToneHex(t,-.25),rel_hiContrast:getContrastedColorsAPCA(o).hiContrast}}function getContrastedColorsAPCA(e){let t=qe(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=qe.contrastAPCA(t,n),s=qe.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!ae(n,i)||!ae(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:qe(n.brighten(.4)).hex(),loContrast:n.hex()}:{hiContrast:qe(r.darken(.4)).hex(),loContrast:r.hex()}}const Xi=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function applyCachedLayout(e,t){let{nodes:n,edges:r,hasManualLayout:i,...a}=e,o=new Map(n.map(e=>[e.id,e])),s=new Map(r.map(e=>[e.id,e])),c=t.nodes.map(e=>{let t=o.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),l=t.edges.map(e=>{let t=s.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints}}:e}),u={...t,...a,[U]:`layouted`,bounds:t.bounds,nodes:c,edges:l};return i?u[Ri]=`auto`:delete u[Ri],u}function buildElementNotations(e){return E(e,O(e=>!!e.notation),oe(w(`notation`)),l(Be(oe(w(`shape`)),l(Be(oe(w(`color`)),l(Be(y(w(`kind`)),T())),Ie(),y(([e,t])=>({kinds:t,color:e})))),Ie(),k(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),Ie(),k(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),Re(w(`shape`),w(`title`),[e=>e.kinds.length,`desc`]))}const changed=(e,t)=>e===t||b(e)&&b(t)?!1:!ae(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],b(t.style.border)?delete e.style.border:e.style.border=t.style.border,g(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,b(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function autoApplyIcon(e,t,n){if(changed(t.icon??`none`,e.icon??`none`)){let r=_(e.icon)&&e.icon!==`none`;switch(!0){case r&&_(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(b(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&_(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function autoApplyIconStyles(e,t,n){let r=!0;return changed(e.style.iconColor,t.style.iconColor)&&(b(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),changed(e.style.iconSize,t.style.iconSize)&&(n?b(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),changed(e.style.iconPosition,t.style.iconPosition)&&(n?b(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}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,n){let r=!0;return changed(e.title,t.title)&&(n?e.title=t.title:r=!1),changed(e.description,t.description)&&(b(t.description)?delete e.description:n?e.description=patchMarkdownOrString(e.description,t.description):r=!1),changed(e.technology,t.technology)&&(b(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function autoApplyLabelsToCompound(e,t,n){return e.title=t.title,b(t.description)?delete e.description:e.description=patchMarkdownOrString(e.description,t.description),b(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 n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=applyNodesManualLayout(t.nodes,e.nodes,n),i=applyEdgesManualLayout(t.edges,e.edges,n),a=buildElementNotations(r);return mt(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[Ri]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=ht(r),o.edges=ht(i),isDynamicView$1(e)&&o._type===`dynamic`&&(o.variant=e.variant),isElementView$1(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];D(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function applyNodesManualLayout(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),mt(e,r=>{autoApplyMetaAndStyles(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(changed(r.modelRef,t.modelRef)||changed(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),changed(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;changed(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),autoApplyIconStyles(r,t,s)||i.add(`label-changed`),autoApplyIcon(r,t,s&&o===a)||i.add(`label-changed`),(a?autoApplyLabelsToCompound:autoApplyLabelsToLeaf)(r,t,s)||i.add(`label-changed`),changed(r.notes,t.notes)&&(b(t.notes)?delete r.notes:r.notes=patchMarkdownOrString(r.notes,t.notes)),changed(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&symmetricDifference(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];D(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function applyEdgesManualLayout(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??E(r.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&r.delete(t.id),mt(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:changed(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default: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(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,changed(e.notes,t.notes)&&(b(e.notes)!==b(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,changed(le(e,[`label`,`description`,`technology`,`labelBBox`]),le(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),changed(e.label,t.label)&&(b(t.label)!==b(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),changed(e.description,t.description)&&(b(t.description)!==b(e.description)&&i.add(`label-changed`),t.description&&(r.description=patchMarkdownOrString(e.description,t.description))),changed(e.technology,t.technology)&&(b(t.technology)!==b(e.technology)&&i.add(`label-changed`),r.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 o=[...i];D(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function calcDriftsFromSnapshot(e,t){let{drifts:n,...r}=applyManualLayout(e,t);if(!n||n.length===0)return mt(e,e=>{delete e.drifts,e[Ri]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),mt(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??E(o.values(),ifilter(t=>t.source===e.source&&t.target===e.target),ihead());return t&&o.delete(t.id),mt(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return mt(e,e=>{D(l,1)?e.drifts=l:delete e.drifts,e.nodes=ht(s),e.edges=ht(c),e[Ri]=`auto`})}const parseStack=e=>e.split(`
|
|
2
|
+
`).map(e=>e.trim().replace(`file://`,``));function indent$1(e,t=2){e=Array.isArray(e)?e:e.split(`
|
|
3
3
|
`);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
|
|
4
|
-
`)}function loggable(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=
|
|
5
|
-
`+indent(e.slice(1))}return t.message}return
|
|
6
|
-
`),[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`?
|
|
4
|
+
`)}t(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+`
|
|
5
|
+
`+indent$1(e.slice(1))}return t.message}return Ct(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(`
|
|
6
|
+
`),[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+`
|
|
7
7
|
`):t}function appendErrorToMessage(e,t=!1){let n=getErrorFromLogRecord(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
|
|
8
|
-
`+indent(n.stack.split(`
|
|
9
|
-
`).slice(1))),t&&(r=`${
|
|
10
|
-
`+indent(r)}}return e}const Oi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>Oi[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return vt({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const ki=`\x1B[0m`,Ai={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return bt({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:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function getConsoleSink(e){return yt({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const G=_t(`likec4`);function createLogger(e){return G.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:getConsoleSink(),...t};xt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`);function findParallelRects(e){return D(e,oe(e=>e.parallelPrefix??void 0),l((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 n=new nt.default,r=[];return e.forEach(e=>{let t=parentsLookup(e);if(t.length===0){n.clear();return}let i=nt.default.from(t),a,o;for(;a=n.peek()?.node,o=i.peek(),!(!o||!a);){if(isAncestor(o.id,a.id)||o.id===a.id){i.pop();continue}if(!isAncestor(a.id,o.id)){n.pop();continue}break}for(;o=i.pop();){let t={node:o,from:e,to:e,nested:[]},i=n.peek();i?i.nested.push(t):r.push(t),n.push(t)}n.forEach(t=>t.to=e)}),r}var SequenceViewLayouter=class{#e=new Ot;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,k.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of findParallelRects(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,k.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,k.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,k.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Ce(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=nonNullable(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=nonNullable(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),invariant(e>=0,`actor ${t} not found`)}return nonNullable(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return y(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,k.strong).before(i),this.put(s,k.strong).before(r),this.put(c,k.strong).after(a.right),this.put(l,k.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];invariant(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=b(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=nonNullable(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Tt;return this.#e.addEditVariable(t,k.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,k.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,k.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,k.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,k.weak);break}}constraint(e,t,n=void 0,r=k.medium){let i;switch(t){case`==`:i=Dt.Eq;break;case`>=`:i=Dt.Ge;break;case`<=`:i=Dt.Le;break;case`== 0`:i=Dt.Eq,n=0;break;case`>= 0`:i=Dt.Ge,n=0;break;case`<= 0`:i=Dt.Le,n=0;break;default:nonexhaustive(t)}this.#e.addConstraint(new Et(e,i,n??0,r))}put(e,t=k.required){let n=t===k.required?k.medium:k.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function calcSequenceLayout(e){let t=new Set,getNode=t=>nonNullable(e.nodes.find(e=>e.id===t)),n=[];for(let r of e.edges.filter(e=>isStepEdgeId(e.id))){let e=getNode(r.source),i=getNode(r.target);if(e.children.length||i.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(i),n.push({edge:r,source:e,target:i})}let r=e.nodes.filter(e=>t.has(e));invariant(T(r,1),`actors array must not be empty`);let i=new O.default(()=>[]),a=[],o=0;for(let{edge:e,source:t,target:s}of n){let n=a.at(-1),c=r.indexOf(t),l=r.indexOf(s),u=t===s,d=c>l,f=getParallelStepsPrefix(e.id),p=!1;n&&n.target==t&&n.parallelPrefix===f&&(p=n.isSelfLoop!==u||n.isBack===d),p||o++;let m={id:e.id,from:{column:c,row:o},to:{column:l,row:u?++o:o},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(n?.offset??0)+22:0,source:t,target:s,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};a.push(m),i.get(t).push({step:m,row:o,type:`source`,position:d&&!u?`left`:`right`}),i.get(s).push({step:m,row:o,type:`target`,position:d||u?`right`:`left`})}let s=new SequenceViewLayouter({actors:r,steps:a,compounds:buildCompounds(r,e.nodes)}),c=s.getViewBounds(),u=D(s.getCompoundBoxes(),y(({node:e,...t})=>({...t,id:e.id,origin:e.id})),se(`id`),l((e,t)=>T(e,2)?y(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Fe(),Be());return{actors:r.map(e=>toSeqActor({actor:e,ports:i.get(e),layout:s})),compounds:u,steps:y(a,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:s.getParallelBoxes(),bounds:c}}function toSeqActor({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var ji=e(jt(),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(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`)}function wrap(e,{maxchars:t,maxLines:n,sanitize:r=Pe()}){let i=(0,ji.default)(e,{width:t,indent:``,escape:r}).split(`
|
|
11
|
-
`);return x(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function wrapWithFont({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=wrap(e,{maxchars:t,maxLines:r,sanitize}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${pxToPoints(n)}"${s}>${o}</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:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=_(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[wrapWithFont({text:e.title,fontsize:r.textSize,maxchars:maxchars(n),maxLines:a?1:3})];if(n!==`xs`){_(e.technology?.trim())&&l.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Ei.from(e.description).text;t&&l.push(wrapWithFont({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function compoundLabel(e,t){let n=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Mi=`BGCOLOR="${Ci.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let n=[];return _(e?.trim())&&n.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),_(t?.trim())&&n.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Mi}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function stepEdgeLabel(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Mi}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return _(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Mi} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}var Ni=Ye(),Pi=e(Xe(),1);const Fi=`Arial`,Ii=createLogger(`dot`);var DotPrinter=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Ft({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;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`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=hierarchyDistance(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let traverseClusters=(e,t)=>{let n=this.generateGraphvizId(e),r=this.elementToSubgraph(e,t.subgraph(n));this.subgraphs.set(e.id,r);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,r);else{let t=nonNullable(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);r.node(t.id)}}},t=[];for(let n of this.view.nodes)if(isCompound(n))g(n.parent)&&t.push(n);else{let t=this.generateGraphvizId(n),r=this.elementToNode(n,e.node(t));this.nodes.set(n.id,r)}for(let n of t)traverseClusters(n,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return At(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=kt({[A.likec4_viewId]:this.view.id,[A.bgcolor]:`transparent`,[A.layout]:`dot`,[A.compound]:!0,[A.rankdir]:e.direction,[A.TBbalance]:`min`,[A.splines]:`spline`,[A.outputorder]:`nodesfirst`,[A.nodesep]:pxToInch(e.nodeSep??110),[A.ranksep]:pxToInch(e.rankSep??120),[A.pad]:pxToInch(15),[A.fontname]:Fi});return t.attributes.graph.apply({[A.fontsize]:pxToPoints(this.styles.fontSize()),[A.labeljust]:e.direction===`RL`?`r`:`l`,[A.labelloc]:e.direction===`BT`?`b`:`t`,[A.margin]:50.1}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[A.fontname]:Fi,[A.shape]:`rect`,[A.fillcolor]:t.fill,[A.fontcolor]:t.hiContrast,[A.color]:t.stroke,[A.style]:`filled`,[A.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[A.arrowsize]:.75,[A.fontname]:Fi,[A.fontsize]:pxToPoints(14),[A.penwidth]:pxToPoints(2),[A.color]:t.line,[A.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),n=nameFromFqn(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=nameFromFqn(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){invariant(isCompound(e),`node should be compound`),invariant(p(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=compoundLabelColor(n.loContrast);return t.apply({[A.likec4_id]:e.id,[A.likec4_level]:e.level,[A.likec4_depth]:e.depth,[A.fillcolor]:compoundColor(n.fill,e.depth),[A.color]:compoundColor(n.stroke,e.depth),[A.style]:`filled`,[A.margin]:pxToPoints(e.children.length>1?40:32)}),f(e.title.trim())||t.set(A.label,compoundLabel(e,r)),t}elementToNode(e,t){invariant(!isCompound(e),`node should not be compound`);let n=_(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[A.likec4_id]:e.id,[A.likec4_level]:e.level,[A.label]:nodeLabel(e,this.styles),[A.margin]:`${pxToInch(s)},${pxToInch(i)}`}),t.attributes.set(A.width,pxToInch(a)),t.attributes.set(A.height,pxToInch(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[A.fillcolor]:r.fill,[A.fontcolor]:r.hiContrast,[A.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[A.margin]:`${pxToInch(s)},${pxToInch(0)}`,[A.penwidth]:pxToPoints(2),[A.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[A.margin]:`${pxToInch(n?s:s+4)},${pxToInch(i+6)}`});break;case`mobile`:t.attributes.apply({[A.margin]:`${pxToInch(n?s:s+4)},${pxToInch(i)}`});break;case`queue`:t.attributes.apply({[A.width]:pxToInch(a),[A.height]:pxToInch(o-8),[A.margin]:`${pxToInch(n?s:s+4)},${pxToInch(i)}`});break;case`component`:t.attributes.apply({[A.width]:pxToInch(a+10),[A.margin]:`${pxToInch(s+20)},${pxToInch(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(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.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return nonNullable(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(invariant(isCompound(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,invariant(i,`subgraph ${e} not found`),n=nonNullable(t(this.leafElements(e)),`leaf element in ${e} not found`),r=nonNullable(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return D(this.descendants(e),E(e=>he(e.inEdges,e.outEdges)),C(),Te(he(t.inEdges,t.outEdges)),y(e=>this.view.edges.find(t=>t.id===e)),w(_))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=D(this.view.nodes,w(isCompound),y(e=>e.id),fe(compareFqnHierarchically),me(),y(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),w(({edges:e})=>e.length>1&&e.length<8),de(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=nonNullable(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=nonNullable(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(A.group,n.id),i.attributes.set(A.group,n.id)}catch(e){Ii.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=pxToInch(i.center.x)+n,o=pxToInch(e-i.center.y);i.fixedsize?t.attributes.apply({[A.pos]:`${a},${o}!`,[A.pin]:!0,[A.width]:pxToInch(i.fixedsize.width),[A.height]:pxToInch(i.fixedsize.height),[A.fixedsize]:!0}):t.attributes.set(A.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(A.weight),e.attributes.delete(A.minlen),e.attributes.delete(A.constraint);return this.graphvizModel.apply({[A.layout]:`fdp`,[A.overlap]:`vpsc`,[A.sep]:`+50,50`,[A.esep]:`+10,10`,[A.start]:`random2`,[A.splines]:`compound`,[A.K]:10}),this.graphvizModel.delete(A.compound),this.graphvizModel.delete(A.rankdir),this.graphvizModel.delete(A.nodesep),this.graphvizModel.delete(A.ranksep),this.graphvizModel.delete(A.pack),this.graphvizModel.delete(A.pad),this.graphvizModel.delete(A.packmode),this.graphvizModel.attributes.graph.delete(A.margin),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(A.TBbalance),e.apply({[A.nodesep]:pxToInch(t.nodeSep??130),[A.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(e){D(this.view.nodes,y(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),oe(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Fe(),y(e=>e),i(t=>{t.length<2||e.subgraph({[A.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(nonNullable(n).id)})}),Ae(()=>{e.set(A.newrank,!0),e.set(A.clusterrank,`global`),e.delete(A.pack),e.delete(A.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(A.margin,pxToPoints(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Ce(e)),[s,c,l]=this.edgeEndpoint(r,ke),u=Ke(l)||Ke(o),d=t.edge([a,c],{[A.likec4_id]:e.id,[A.style]:e.line??`dashed`});l&&d.attributes.set(A.lhead,l),o&&d.attributes.set(A.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(A.weight,f);let p=edgelabel(e);if(p&&d.attributes.set(u?A.xlabel:A.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[A.color]:t.line,[A.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[A.arrowtail]:`none`,[A.arrowhead]:`none`,[A.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[A.arrowhead]:toArrowType(m),[A.arrowtail]:toArrowType(e.tail??m),[A.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(A.constraint,!1),d):(m&&d.attributes.set(A.arrowhead,toArrowType(m)),h!==`none`&&d.attributes.set(A.arrowtail,toArrowType(h)),d)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(A.TBbalance),e.set(A.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Ce(e)),[c,l,u]=this.edgeEndpoint(i,ke),d=t.edge([o,l],{[A.likec4_id]:e.id,[A.style]:e.line??`dashed`});if(u&&d.attributes.set(A.lhead,u),s&&d.attributes.set(A.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[A.color]:t.line,[A.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(_).join(`
|
|
12
|
-
`),p=stepEdgeLabel(extractStep(e.id),f);d.attributes.set(
|
|
13
|
-
{labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);invariant(
|
|
14
|
-
`):null,{id:t,source:n,target:r,label:a,..._(o)&&{description:o},points:parseEdgePoints(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function parseGraphvizJson(e,t){let n=parseBB(e.bb),{nodes:r,edges:i,hasManualLayout:a,...o}=t,s=[],c=[],l;if(l=o._type===`dynamic`?{...o,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[
|
|
8
|
+
`+indent$1(n.stack.split(`
|
|
9
|
+
`).slice(1))),t&&(r=`${$i.red}${r}${Qi}`),{...e,message:e.message+`
|
|
10
|
+
`+indent$1(r)}}return e}const Zi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>Zi[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return _t({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const Qi=`\x1B[0m`,$i={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return yt({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:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function getConsoleSink(e){return vt({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const ea=gt(`likec4`);function createLogger(e){return ea.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:getConsoleSink(),...t};bt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`);function findParallelRects(e){return E(e,oe(e=>e.parallelPrefix??void 0),l((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}})),Ne())}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 n=new $e.default,r=[];return e.forEach(e=>{let t=parentsLookup(e);if(t.length===0){n.clear();return}let i=$e.default.from(t),a,o;for(;a=n.peek()?.node,o=i.peek(),!(!o||!a);){if(isAncestor(o.id,a.id)||o.id===a.id){i.pop();continue}if(!isAncestor(a.id,o.id)){n.pop();continue}break}for(;o=i.pop();){let t={node:o,from:e,to:e,nested:[]},i=n.peek();i?i.nested.push(t):r.push(t),n.push(t)}n.forEach(t=>t.to=e)}),r}var SequenceViewLayouter=class{#e=new Dt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,j.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of findParallelRects(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,j.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,j.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,j.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Ce(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=nonNullable(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=nonNullable(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),invariant(e>=0,`actor ${t} not found`)}return nonNullable(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return y(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,j.strong).before(i),this.put(s,j.strong).before(r),this.put(c,j.strong).after(a.right),this.put(l,j.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];invariant(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=x(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=nonNullable(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new wt;return this.#e.addEditVariable(t,j.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,j.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,j.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,j.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,j.weak);break}}constraint(e,t,n=void 0,r=j.medium){let i;switch(t){case`==`:i=Et.Eq;break;case`>=`:i=Et.Ge;break;case`<=`:i=Et.Le;break;case`== 0`:i=Et.Eq,n=0;break;case`>= 0`:i=Et.Ge,n=0;break;case`<= 0`:i=Et.Le,n=0;break;default:nonexhaustive(t)}this.#e.addConstraint(new Tt(e,i,n??0,r))}put(e,t=j.required){let n=t===j.required?j.medium:j.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function calcSequenceLayout(e){let t=new Set,getNode=t=>nonNullable(e.nodes.find(e=>e.id===t)),n=[];for(let r of e.edges.filter(e=>isStepEdgeId(e.id))){let e=getNode(r.source),i=getNode(r.target);if(e.children.length||i.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(i),n.push({edge:r,source:e,target:i})}let r=e.nodes.filter(e=>t.has(e));invariant(D(r,1),`actors array must not be empty`);let i=new A.default(()=>[]),a=[],o=0;for(let{edge:e,source:t,target:s}of n){let n=a.at(-1),c=r.indexOf(t),l=r.indexOf(s),u=t===s,d=c>l,f=getParallelStepsPrefix(e.id),p=!1;n&&n.target==t&&n.parallelPrefix===f&&(p=n.isSelfLoop!==u||n.isBack===d),p||o++;let m={id:e.id,from:{column:c,row:o},to:{column:l,row:u?++o:o},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(n?.offset??0)+22:0,source:t,target:s,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};a.push(m),i.get(t).push({step:m,row:o,type:`source`,position:d&&!u?`left`:`right`}),i.get(s).push({step:m,row:o,type:`target`,position:d||u?`right`:`left`})}let s=new SequenceViewLayouter({actors:r,steps:a,compounds:buildCompounds(r,e.nodes)}),c=s.getViewBounds(),u=E(s.getCompoundBoxes(),y(({node:e,...t})=>({...t,id:e.id,origin:e.id})),ie(`id`),l((e,t)=>D(e,2)?y(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Ne(),Oe());return{actors:r.map(e=>toSeqActor({actor:e,ports:i.get(e),layout:s})),compounds:u,steps:y(a,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:s.getParallelBoxes(),bounds:c}}function toSeqActor({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var ta=e(At(),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 Mt(Nt(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Mt(jt(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`)}function wrap(e,{maxchars:t,maxLines:n,sanitize:r=m()}){let i=(0,ta.default)(e,{width:t,indent:``,escape:r}).split(`
|
|
11
|
+
`);return C(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function wrapWithFont({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=wrap(e,{maxchars:t,maxLines:r,sanitize}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${pxToPoints(n)}"${s}>${o}</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:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=_(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[wrapWithFont({text:e.title,fontsize:r.textSize,maxchars:maxchars(n),maxLines:a?1:3})];if(n!==`xs`){_(e.technology?.trim())&&l.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=qi.from(e.description).text;t&&l.push(wrapWithFont({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function compoundLabel(e,t){let n=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const na=`BGCOLOR="${Wi.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let n=[];return _(e?.trim())&&n.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),_(t?.trim())&&n.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${na}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function stepEdgeLabel(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${na}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return _(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${na} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}var ra=et(),ia=e(tt(),1);const aa=`Arial`,oa=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new A.default(e=>nonNullable(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=oa;graphology=new Pt({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`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=hierarchyDistance(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.G=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.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 n of this.selectViewNodes())if(isCompound(n))b(n.parent)&&t.push(n);else{let t=this.generateGraphvizId(n),r=this.elementToNode(n,e.node(t));this.nodes.set(n.id,r)}let traverseClusters=(e,t)=>{let n=this.generateGraphvizId(e),r=this.elementToSubgraph(e,t.subgraph(n));this.subgraphs.set(e.id,r);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,r);else{let t=this.getGraphNode(e.id);t&&r.node(t.id)}}};for(let n of t)traverseClusters(n,e);for(let t of this.selectViewEdges()){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}return this}print(){return this.build(),this.postBuild(this.G),Ot(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(M.rank))&&this.G.set(M.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,n=kt({[M.likec4_viewId]:this.view.id,[M.bgcolor]:`transparent`,[M.layout]:`dot`,[M.compound]:!0,[M.rankdir]:t,[M.TBbalance]:`min`,[M.splines]:`spline`,[M.outputorder]:`nodesfirst`,[M.nodesep]:pxToInch(e.nodeSep??110),[M.ranksep]:pxToInch(e.rankSep??120),[M.pad]:pxToInch(15),[M.fontname]:aa});return n.attributes.graph.apply({[M.fontsize]:pxToPoints(this.styles.fontSize()),[M.labeljust]:t===`RL`?`r`:`l`,[M.labelloc]:t===`BT`?`b`:`t`,[M.margin]:50.1}),n}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[M.fontname]:aa,[M.shape]:`rect`,[M.fillcolor]:t.fill,[M.fontcolor]:t.hiContrast,[M.color]:t.stroke,[M.style]:`filled`,[M.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[M.arrowsize]:.75,[M.fontname]:aa,[M.fontsize]:pxToPoints(14),[M.penwidth]:pxToPoints(2),[M.color]:t.line,[M.fontcolor]:t.label,[M.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),n=nameFromFqn(e.id).toLowerCase(),r=this.reserveNodeId(n,t),i=1;for(;r===!1;)r=this.reserveNodeId(n+`_`+ i++,t);return r}elementToSubgraph(e,t){invariant(isCompound(e),`node should be compound`),invariant(g(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=compoundLabelColor(n.loContrast);return t.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.likec4_depth]:e.depth,[M.fillcolor]:compoundColor(n.fill,e.depth),[M.color]:compoundColor(n.stroke,e.depth),[M.style]:`filled`,[M.margin]:pxToPoints(e.children.length>1?40:32)}),S(e.title.trim())||t.set(M.label,compoundLabel(e,r)),t}elementToNode(e,t){invariant(!isCompound(e),`node should not be compound`);let n=_(e.icon),{values:{padding:r,sizes:{width:i,height:a}}}=this.styles.nodeSizes(e.style),o=n?8:r;if(t.attributes.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.label]:nodeLabel(e,this.styles),[M.margin]:`${pxToInch(o)},${pxToInch(r)}`}),t.attributes.set(M.width,pxToInch(i)),t.attributes.set(M.height,pxToInch(a)),!this.styles.isDefaultColor(e.color)){let n=this.styles.colors(e.color).elements;t.attributes.apply({[M.fillcolor]:n.fill,[M.fontcolor]:n.hiContrast,[M.color]:n.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[M.margin]:`${pxToInch(o)},${pxToInch(0)}`,[M.penwidth]:pxToPoints(2),[M.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[M.margin]:`${pxToInch(n?o:o+4)},${pxToInch(r+6)}`});break;case`mobile`:t.attributes.apply({[M.margin]:`${pxToInch(n?o:o+4)},${pxToInch(r)}`});break;case`queue`:t.attributes.apply({[M.width]:pxToInch(i),[M.height]:pxToInch(a-8),[M.margin]:`${pxToInch(n?o:o+4)},${pxToInch(r)}`});break;case`component`:t.attributes.apply({[M.width]:pxToInch(i+10),[M.margin]:`${pxToInch(o+20)},${pxToInch(r)}`});break;default:break}return t}leafElements(e){return e===null?O([...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 n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(invariant(isCompound(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,invariant(i,`subgraph ${e} not found`),n=nonNullable(t(this.leafElements(e)),`leaf element in ${e} not found`),r=nonNullable(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return E(this.descendants(e),k(e=>je(e.inEdges,e.outEdges)),T(),ze(je(t.inEdges,t.outEdges)),y(e=>this.view.edges.find(t=>t.id===e)),O(_))}assignGroups(){let e=E(this.view.nodes,O(isCompound),y(e=>e.id),fe(compareFqnHierarchically),me(),y(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),O(({edges:e})=>e.length>1&&e.length<8),ue(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=nonNullable(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=nonNullable(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(M.group,n.id),i.attributes.set(M.group,n.id)}catch(e){oa.error(`Failed to assign group to edge ${r.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,n){super(e,t),this.aiHints=n}createGraph(){let e=super.createGraph();return e.delete(M.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let n of this.aiHints.nodeOrder){let r=e.findIndex(e=>e.id===n);r!==-1&&t.push(...e.splice(r,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let n of this.aiHints.edgeOrder){let r=e.findIndex(e=>e.id===n);r!==-1&&t.push(...e.splice(r,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 n=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(o);if(n.length===0||t.rank===`same`&&n.length===1)continue;let r=e.createSubgraph({[M.rank]:t.rank});for(let e of n)r.node(e.id)}return this}addEdge(e,t){let n=this.aiHints.reverseRank?.includes(e.id)??!1,[r,i]=n?[e.target,e.source]:[e.source,e.target],[,a,s]=this.edgeEndpoint(r,e=>Ce(e)),[,c,l]=this.edgeEndpoint(i,Pe),u=t.edge([a,c],{[M.likec4_id]:e.id});e.line&&e.line!==`dashed`&&u.attributes.set(M.style,e.line),l&&u.attributes.set(M.lhead,l),s&&u.attributes.set(M.ltail,s);let d=o(l)||o(s),f=edgelabel(e);if(f&&u.attributes.set(d?M.xlabel:M.label,f),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;u.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let p=this.aiHints.edgeWeight[e.id];p!==void 0&&p!==1&&u.attributes.set(M.weight,p);let m=this.aiHints.edgeMinlen[e.id];return m!==void 0&&m!==1&&u.attributes.set(M.minlen,m),this.aiHints.excludeFromRanking?.includes(e.id)&&u.attributes.set(M.constraint,!1),n&&u.attributes.set(M.dir,`back`),u}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:n,...r}of this.aiHints.invisibleEdges){let i=this.getGraphNode(t),a=this.getGraphNode(n);if(!i||!a)continue;let o=`invisible_${t}->${n}`;if(this.edges.has(o)){this.logger.trace`invisible edge ${t} -> ${n} already exists with id ${o}, skipping creation`;continue}this.graphology.addEdgeWithKey(o,t,n,{hierarchyDistance:0,origin:`invisible`,weight:r.weight??1});let s=e.edge([i,a],{[M.style]:`invis`});this.edges.set(o,s),r.minlen!==void 0&&r.minlen!==1&&s.attributes.set(M.minlen,r.minlen),r.weight!==void 0&&r.weight!==1&&s.attributes.set(M.weight,r.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return g(e.rankSep)||!(Ie(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(M.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(M.TBbalance),e.apply({[M.nodesep]:pxToInch(t.nodeSep??130),[M.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return E(this.view.nodes,y(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),oe(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Ne(),y(e=>e),pe(t=>{t.length<2||e.subgraph({[M.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(nonNullable(n).id)})}),ke(()=>{e.set(M.newrank,!0),e.set(M.clusterrank,`global`),e.delete(M.pack),e.delete(M.packmode)})),this}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(M.margin,pxToPoints(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,s]=this.edgeEndpoint(n,e=>Ce(e)),[c,l,u]=this.edgeEndpoint(r,Pe),d=o(u)||o(s),f=t.edge([a,l],{[M.likec4_id]:e.id,[M.style]:e.line??`dashed`});u&&f.attributes.set(M.lhead,u),s&&f.attributes.set(M.ltail,s);let p=this.graphology.getEdgeAttribute(e.id,`weight`);p>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&f.attributes.set(M.weight,p);let m=edgelabel(e);if(m&&f.attributes.set(d?M.xlabel:M.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return h===`none`&&g===`none`?(f.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`}),f):e.dir===`both`?(f.attributes.apply({[M.arrowhead]:toArrowType(h),[M.arrowtail]:toArrowType(e.tail??h),[M.dir]:`both`}),!d&&i.modelRef!==c.modelRef&&f.attributes.set(M.constraint,!1),f):(h&&f.attributes.set(M.arrowhead,toArrowType(h)),g!==`none`&&f.attributes.set(M.arrowtail,toArrowType(g)),f)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(M.TBbalance),e.set(M.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Ce(e)),[c,l,u]=this.edgeEndpoint(i,Pe),d=t.edge([o,l],{[M.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&d.attributes.set(M.style,e.line),u&&d.attributes.set(M.lhead,u),s&&d.attributes.set(M.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(_).join(`
|
|
12
|
+
`),p=stepEdgeLabel(extractStep(e.id),f);d.attributes.set(M.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[M.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[M.arrowtail]:toArrowType(h),[M.dir]:`back`}),g!==`none`&&d.attributes.apply({[M.arrowhead]:toArrowType(g),[M.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[M.arrowhead]:toArrowType(h),[M.arrowtail]:toArrowType(g),[M.dir]:`both`}),d):h===`none`?(d.attributes.delete(M.arrowhead),d.attributes.apply({[M.arrowtail]:toArrowType(g),[M.minlen]:0,[M.dir]:`back`}),d):(d.attributes.set(M.arrowhead,toArrowType(h)),d)}};const sa=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,n)=>(isCompound(n)&&(e.add(n.id),t.push(n)),t),[]);for(let e of t){let t=E(e.children,O(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),y(e=>this.computedNode(e)));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let r=nonNullable(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),i=null;ye(t,n).forEach(e=>{let t=e.length>1?r.createSubgraph({[M.rank]:`same`}):null;e.forEach((e,n)=>{let a=this.getGraphNode(e.id);a&&(t?.node(a.id),n===0&&(i&&r.edge([i,a],{[M.style]:`invis`}),i=a))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let n of e){let e=[...new Set(n.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let r=this.G.createSubgraph({[M.rank]:n.type});e.forEach(e=>r.node(e.id)),t+=1,sa.trace`rank ${n.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,s]=this.edgeEndpoint(n,e=>Ce(e)),[c,l,u]=this.edgeEndpoint(r,Pe),d=e.parent,f=this.graphology.getEdgeAttributes(e.id),p=t.edge([a,l],{[M.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&p.attributes.set(M.style,e.line),u&&p.attributes.set(M.lhead,u),s&&p.attributes.set(M.ltail,s);let m=o(u)||o(s),h=edgelabel(e);if(h&&p.attributes.set(m?M.xlabel:M.label,h),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;p.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&f.weight>1&&p.attributes.set(M.weight,f.weight);let[g,_]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return p.attributes.apply({[M.arrowtail]:toArrowType(g),[M.dir]:`back`}),_!==`none`&&p.attributes.apply({[M.arrowhead]:toArrowType(_),[M.dir]:`both`,[M.minlen]:0}),p;if(g===`none`&&_===`none`)return p.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`,[M.minlen]:0,[M.constraint]:!1}),p;if(g!==`none`&&_!==`none`)return p.attributes.apply({[M.arrowhead]:toArrowType(g),[M.arrowtail]:toArrowType(_),[M.dir]:`both`}),p;if(p.attributes.set(M.arrowhead,toArrowType(g)),_!==`none`&&p.attributes.set(M.arrowtail,toArrowType(_)),this.view.edges.length===1)return p;let v;return v=d===null&&i.parent==null&&c.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return isCompound(n)||isCompound(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(d).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),v.length===0&&(d===null||this.leafElements(d).length<=3)&&p.attributes.set(M.minlen,0),p}};function parseBB(e){let[t,n,r,i]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function parsePos(e){try{let[t,n]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:n}=parsePos(e.pos),r=inchToPx(parseFloat(e.width)),i=inchToPx(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function parseLabelBbox(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=pointToPx(c.size);continue}if(c.op===`T`){let e=pointToPx(c.pt[0])-t,l=pointToPx(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=pointToPx(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return ea.warn(`Failed on parsing label draw ops:
|
|
13
|
+
{labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);invariant(D(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&ea.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>pointToPx(e));return invariant(D(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function parseGraphvizEdge(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?wrap(a,{maxchars:40,maxLines:5}).join(`
|
|
14
|
+
`):null,{id:t,source:n,target:r,label:a,..._(o)&&{description:o},points:parseEdgePoints(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function parseGraphvizJson(e,t){let n=parseBB(e.bb),{nodes:r,edges:i,hasManualLayout:a,...o}=t,s=[],c=[],l;if(l=o._type===`dynamic`?{...o,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[U]:`layouted`,bounds:n,nodes:s,edges:c}:{...o,[U]:`layouted`,bounds:n,nodes:s,edges:c},a){let e=l;e[Ri]=`auto`}let u=e.objects??[];for(let e of r){let t=u.find(t=>t.likec4_id===e.id);invariant(t,`View ${o.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?parseBB(t.bb):parseNode(t),o=[n,r];s.push({...e,x:n,y:r,width:i,height:a,labelBBox:parseLabelBbox(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let d=e.edges??[];for(let e of i){let t=d.find(t=>t.likec4_id===e.id);if(!t){ea.warn`View ${o.id} edge ${e.id} not found in graphviz output, skipping`;continue}c.push(parseGraphvizEdge(t,e,o.id))}return l}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var ca=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,Wi.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[M.nodesep]:pxToInch(100),[M.ranksep]:pxToInch(100)}),e.delete(M.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[M.likec4_id]:e.id,[M.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=nonNullable(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=nonNullable(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[M.likec4_id]:e.id,[M.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&a.attributes.set(M.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(M.weight,i.weight);let o=edgelabel(e);if(o&&a.attributes.set(M.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}return a}};const la=Ft(1);var ua=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){oi.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,n){return await la(async()=>{let r=ea.getChild([`layouter`,`wasm`,e,`_`,Te(4).toLowerCase()]);try{r.trace`execute`;let e=await n();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,r.trace`reached 20 operations, unloading wasm`,oi.unload()),e}catch(e){r.trace(`FAILED DOT
|
|
15
|
+
`+t);let n=loggable(e);if(n.includes(`syntax error`))throw e;r.warn(n),GraphvizWasmAdapter.opsCount=0,oi.unload()}return r.warn(`Retrying...`),await delay(30,300),await n()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await oi.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 oi.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await oi.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await oi.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)}},da=ea.getChild(`layouter`);function normalizeDot(e){return e.split(`
|
|
15
16
|
`).filter(e=>!(e.includes(`margin`)&&e.includes(`50.1`))).join(`
|
|
16
|
-
`),
|
|
17
|
-
`).filter(e=>!(e.includes(`margin`)&&e.includes(`50.1`))).join(`
|
|
18
|
-
`),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=Vi.getChild([`dot`,Ee(3)]);t.trace`generating dot for view ${e.view.id}`;let n=getPrinter(e).print();if(!isElementView$1(e.view))return n;try{return t.trace`unflattening dot`,await this.graphviz.unflatten(n)}catch(r){return t.warn(`Error during unflatten: ${e.view.id}`,{error:r}),n}}async layoutProjectsView(e){let t=Vi.getChild([`layoutProjectsView`,Ee(3)]);t.trace`layouting projects overview...`;let n=new Ri(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(r,e)}};const Hi=G.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Lt({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=Hi.getChild([`run`,Ee(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),Hi.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,Hi.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=Hi.getChild([`batch`,Ee(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 n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.trace`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await promiseNextTick(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,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 r}async waitForQueueToShrink(e=this.queue.concurrency,t=Hi){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{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=splitGlobalFqn(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=hierarchyLevel(r)):(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`),()=>C([...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 Ei.memoize(this,`summary`,preferSummary(this.$element))}get description(){return Ei.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 n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return 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 _(ihead(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!f(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 Ei.memoize(this,`summary`,preferSummary(this.$node))}get description(){return Ei.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 n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return memoizeProp(this,Symbol.for(`allOutgoing`),()=>Ui.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>Ui.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!f(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{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`),()=>C([...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 n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return intersection(t,e)}},DeployedInstanceModel=class extends AbstractDeploymentElementModel{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=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`),()=>C([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return Ei.memoize(this,`summary`,preferSummary(this.$instance)??preferSummary(this.element.$element))}get description(){return Ei.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{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{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=commonAncestor(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return _(this.$relationship.title)?this.$relationship.title:null}get technology(){return ie(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 Ei.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return Ei.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&&!f(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},Ui=class RelationshipsAccum{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(`
|
|
19
|
-
`),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return T(t,1)?t:[``]}return[e.trim()]},normalizeViewPath=e=>splitViewTitle(e).join(`/`),getViewFolderPath=e=>{let t=splitViewTitle(e);return T(t,2)?t.slice(0,-1).join(`/`):null},extractViewTitleFromPath=e=>e.includes(`/`)?splitViewTitle(e).pop()??e:e.trim();var LikeC4DeploymentModel=class{#e=new Map;#t=new Map;#n=new O.default(()=>new Set);#r=new O.default(()=>new Set);#i=new Set;#a=new Map;#o=new O.default(()=>new Set);#s=new O.default(()=>new Set);#c=new O.default(()=>new Set);#l=new O.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Fe(t.elements);for(let e of sortParentsFirst(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of 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),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(V.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return getOrCreate(this.#u,`${t}@${n}`,()=>new NestedElementOfDeployedInstanceModel(this.instance(t),this.$model.element(n)))}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),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=getId(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=getId(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=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 n=parentFqn(t.id);return n?(invariant(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(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 n=t.boundary?.id??null;if(n)for(let e of[n,...ancestorsFqn(n)])this.#c.get(e).add(t);for(let e of ancestorsFqn(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of ancestorsFqn(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},RelationshipModel=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(V.flatten(t.source)),this.target=e.element(V.flatten(t.target));let n=commonAncestor(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return ie(this.$relationship.title)?null:this.$relationship.title}get technology(){return ie(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 Ei.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return Ei.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&&!f(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},EdgeModel=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Ei.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 n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},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 Ei.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Ei.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 n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return _(this.$node.modelRef)}hasDeployment(){return _(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 O.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new 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=n.title?extractViewTitleFromPath(n.title):null,this.viewPath=n.title?normalizeViewPath(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[gi]}get stage(){return this.#e[B]}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 Ei.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[B]===`computed`}isLayouted(){return this.#e[B]===`layouted`}isDiagram(){return this.#e[B]===`layouted`}isElementView(){return this.#e[gi]===`element`}isScopedElementView(){return this.#e._type===`element`&&_(this.#e.viewOf)}isDeploymentView(){return this.#e[gi]===`deployment`}isDynamicView(){return this.#e[gi]===`dynamic`}},Wi=class LikeC4ViewsFolder{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Ce(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return 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`),ie(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})}},Gi=class LikeC4Model{Aux;_elements=new Map;_parents=new Map;_children=new O.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new O.default(()=>new Set);_outgoing=new O.default(()=>new Set);_internal=new O.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new O.default(()=>new Set);_allTags=new O.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:n=`unknown`,project:r,globals:i,imports:a,deployments:o,views:s,relations:c,elements:l,specification:u}=e;return new LikeC4Model({[B]:t,projectId:n,project:r,globals:{predicates:i?.predicates??{},dynamicPredicates:i?.dynamicPredicates??{},styles:i?.styles??{}},imports:a??{},deployments:{elements:o?.elements??{},relations:o?.relations??{}},views:s??{},relations:c??{},elements:l??{},specification:u})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of je(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of je(e.imports??{}))for(let e of sortParentsFirst(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}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(`/`),n=D(Fe(e.views),y(e=>({view:e,path:normalizeViewPath(e.title??e.id),folderPath:e.title&&getViewFolderPath(e.title)||``})),fe((e,n)=>t(e.folderPath,n.folderPath))),getOrCreateFolder=e=>{let t=this._viewFolders.get(e);if(!t){let r=we(e,`/`);invariant(T(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new Wi(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=getOrCreateFolder(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||we(e,`/`).reduce((e,t)=>{let n=e.join(`/`),r=getOrCreateFolder(f(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(r),e.push(t),e},[]);for(let{view:t,folderPath:r}of n){let n=new LikeC4ViewModel(this,getOrCreateFolder(r),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(r).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new Wi(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`,()=>Ci.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[B]}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 n=getId(e),r=this._relations.get(n)??null;return r||t===`model`?nonNullable(r,`Model relation ${n} not found`):nonNullable(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(getId(e))??null;return n||t===`model`?n: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),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=getId(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=getId(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return memoizeProp(this,`tags`,()=>fe([...this._allTags.keys()],compareNatural))}get tagsSortedByUsage(){return memoizeProp(this,`tagsSortedByUsage`,()=>D([...this._allTags.entries()],y(([e,t])=>({tag:e,count:t.size,tagged:t})),fe((e,t)=>compareNatural(e.tag,t.tag)),Ve([S(`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 n=parentFqn(t.id);return n?(invariant(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){invariant(!isGlobalFqn(t.id),`Imported element already has global FQN`);let n=GlobalFqn(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new ElementModel(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=parentFqn(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=parentFqn(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new RelationshipModel(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=commonAncestor(n.id,r.id);if(i)for(let e of[i,...ancestorsFqn(i)])this._internal.get(e).add(t);for(let e of ancestorsFqn(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of ancestorsFqn(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Gi.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Gi||={});let Ki;(function(e){e.isInside=e=>t=>isAncestor(e,t.source.id)&&isAncestor(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||isAncestor(e,n.source.id))&&(n.target.id===t||isAncestor(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||isAncestor(e,t.target.id))&&!isAncestor(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||isAncestor(e,t.source.id))&&!isAncestor(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(Ki||={});const qi=Symbol.for(`nodejs.util.inspect.custom`);var Ji=class DeploymentConnectionModel{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,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}[qi](e,t,n){let r=this.toString();return Object.defineProperty(r,`constructor`,{value:DeploymentConnectionModel,enumerable:!1}),r}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(`
|
|
20
|
-
`)}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
`)}),
|
|
29
|
-
`)}),fileThreshold:F.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(`
|
|
17
|
+
`)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new ua,da.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,da.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 da.getChild([e,`_`,Te(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(loggable(n)),t.error(`Failed to convert DOT to JSON:
|
|
18
|
+
`+e),n}try{return JSON.parse(n)}catch(r){throw t.error(loggable(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=parseGraphvizJson(await this.dotToJson(n),r);return isDynamicView$1(i)&&Object.assign(i,{sequenceLayout:calcSequenceLayout(i)}),n=normalizeDot(n),t.trace`layouting view ${e.view.id} done`,{dot:n,diagram:i}}catch(n){throw t.warn(loggable(n)),wrapError(n,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},n){let r=this.newScopedLogger(`ai-layout`);try{r.trace`layouting view ${e.id} using AI hints...`;let i=new AiLayoutViewPrinter(e,t,n).print(),a=parseGraphvizJson(await this.dotToJson(i),e);return isDynamicView$1(a)&&Object.assign(a,{sequenceLayout:calcSequenceLayout(a)}),i=normalizeDot(i),r.trace`layouting view ${e.id} done`,{dot:i,diagram:a}}catch(t){throw r.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 n=getPrinter(e).print();if(!isElementView$1(e.view))return normalizeDot(n);try{t.trace`unflattening dot`,n=await this.graphviz.unflatten(n)}catch(n){t.warn(`Error during unflatten: ${e.view.id}`,{error:n})}return normalizeDot(n)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let n=new ca(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(r,e)}};const fa=ea.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=fa.getChild([`run`,Te(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),fa.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,fa.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=fa.getChild([`batch`,Te(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 n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.trace`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await promiseNextTick(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,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 r}async waitForQueueToShrink(e=this.queue.concurrency,t=fa){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[n,r]=splitGlobalFqn(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=hierarchyLevel(r)):(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`),()=>T([...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 qi.memoize(this,`summary`,preferSummary(this.$element))}get description(){return qi.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 n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return 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 _(ihead(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!S(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 qi.memoize(this,`summary`,preferSummary(this.$node))}get description(){return qi.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 n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return memoizeProp(this,Symbol.for(`allOutgoing`),()=>pa.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return memoizeProp(this,Symbol.for(`allIncoming`),()=>pa.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!S(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`),()=>T([...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 n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return intersection(t,e)}},DeployedInstanceModel=class extends AbstractDeploymentElementModel{$model;$instance;element;id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=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`),()=>T([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return qi.memoize(this,`summary`,preferSummary(this.$instance)??preferSummary(this.element.$element))}get description(){return qi.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 n=commonAncestor(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return _(this.$relationship.title)?this.$relationship.title:null}get technology(){return f(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 qi.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return qi.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&&!S(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},pa=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(`
|
|
19
|
+
`),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return D(t,1)?t:[``]}return[e.trim()]},normalizeViewPath=e=>splitViewTitle(e).join(`/`),getViewFolderPath=e=>{let t=splitViewTitle(e);return D(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 A.default(()=>new Set);#r=new A.default(()=>new Set);#i=new Set;#a=new Map;#o=new A.default(()=>new Set);#s=new A.default(()=>new Set);#c=new A.default(()=>new Set);#l=new A.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Ne(t.elements);for(let e of sortParentsFirst(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of Ne(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),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(W.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return getOrCreate(this.#u,`${t}@${n}`,()=>new NestedElementOfDeployedInstanceModel(this.instance(t),this.$model.element(n)))}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),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=getId(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=getId(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=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 n=parentFqn(t.id);return n?(invariant(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(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 n=t.boundary?.id??null;if(n)for(let e of[n,...ancestorsFqn(n)])this.#c.get(e).add(t);for(let e of ancestorsFqn(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of ancestorsFqn(t.target.id)){if(e===n)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(W.flatten(t.source)),this.target=e.element(W.flatten(t.target));let n=commonAncestor(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return f(this.$relationship.title)?null:this.$relationship.title}get technology(){return f(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 qi.memoize(this,`summary`,preferSummary(this.$relationship))}get description(){return qi.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&&!S(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,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return qi.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 n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},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 qi.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return qi.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 n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return _(this.$node.modelRef)}hasDeployment(){return _(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 A.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new 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=n.title?extractViewTitleFromPath(n.title):null,this.viewPath=n.title?normalizeViewPath(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Li]}get stage(){return this.#e[U]}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 qi.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[U]===`computed`}isLayouted(){return this.#e[U]===`layouted`}isDiagram(){return this.#e[U]===`layouted`}isElementView(){return this.#e[Li]===`element`}isScopedElementView(){return this.#e._type===`element`&&_(this.#e.viewOf)}isDeploymentView(){return this.#e[Li]===`deployment`}isDynamicView(){return this.#e[Li]===`dynamic`}},ma=class LikeC4ViewsFolder{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Ce(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return 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`),f(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})}},ha=class LikeC4Model{Aux;_elements=new Map;_parents=new Map;_children=new A.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new A.default(()=>new Set);_outgoing=new A.default(()=>new Set);_internal=new A.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new A.default(()=>new Set);_allTags=new A.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:n=`unknown`,project:r,globals:i,imports:a,deployments:o,views:s,relations:c,elements:l,specification:u}=e;return new LikeC4Model({[U]:t,projectId:n,project:r,globals:{predicates:i?.predicates??{},dynamicPredicates:i?.dynamicPredicates??{},styles:i?.styles??{}},imports:a??{},deployments:{elements:o?.elements??{},relations:o?.relations??{}},views:s??{},relations:c??{},elements:l??{},specification:u})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of Ie(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of Ie(e.imports??{}))for(let e of sortParentsFirst(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of Ne(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(`/`),n=E(Ne(e.views),y(e=>({view:e,path:normalizeViewPath(e.title??e.id),folderPath:e.title&&getViewFolderPath(e.title)||``})),fe((e,n)=>t(e.folderPath,n.folderPath))),getOrCreateFolder=e=>{let t=this._viewFolders.get(e);if(!t){let r=we(e,`/`);invariant(D(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new ma(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=getOrCreateFolder(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||we(e,`/`).reduce((e,t)=>{let n=e.join(`/`),r=getOrCreateFolder(S(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(r),e.push(t),e},[]);for(let{view:t,folderPath:r}of n){let n=new LikeC4ViewModel(this,getOrCreateFolder(r),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(r).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new ma(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`,()=>Wi.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[U]}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 n=getId(e),r=this._relations.get(n)??null;return r||t===`model`?nonNullable(r,`Model relation ${n} not found`):nonNullable(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(getId(e))??null;return n||t===`model`?n: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),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=getId(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=getId(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=getId(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return memoizeProp(this,`tags`,()=>fe([...this._allTags.keys()],compareNatural))}get tagsSortedByUsage(){return memoizeProp(this,`tagsSortedByUsage`,()=>E([...this._allTags.entries()],y(([e,t])=>({tag:e,count:t.size,tagged:t})),fe((e,t)=>compareNatural(e.tag,t.tag)),Re([w(`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 n=parentFqn(t.id);return n?(invariant(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){invariant(!isGlobalFqn(t.id),`Imported element already has global FQN`);let n=GlobalFqn(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new ElementModel(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=parentFqn(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=parentFqn(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new RelationshipModel(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=commonAncestor(n.id,r.id);if(i)for(let e of[i,...ancestorsFqn(i)])this._internal.get(e).add(t);for(let e of ancestorsFqn(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of ancestorsFqn(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=ha.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(ha||={});let ga;(function(e){e.isInside=e=>t=>isAncestor(e,t.source.id)&&isAncestor(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||isAncestor(e,n.source.id))&&(n.target.id===t||isAncestor(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||isAncestor(e,t.target.id))&&!isAncestor(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||isAncestor(e,t.source.id))&&!isAncestor(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(ga||={});const _a=Symbol.for(`nodejs.util.inspect.custom`);var va=class DeploymentConnectionModel{source;target;relations;id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,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}[_a](e,t,n){let r=this.toString();return Object.defineProperty(r,"constructor",{value:DeploymentConnectionModel,enumerable:!1}),r}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(`
|
|
20
|
+
`)}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 pa(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 n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=isAncestor(t.source.id,e.source.id),a=isAncestor(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function findDeepestNestedConnection(e,t){let n=t;for(let t of e)isNestedConnection(t,n)&&(n=t);return n===t?null:n}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 E(e,y(e=>({id:boundaryHierarchy(e),conn:e})),sortNaturalByFqn(t),y(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 n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function differenceConnections(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function 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 n=e;return isDescendantOf(n.source,t)&&!isDescendantOf(n.target,t)}function isIncoming(e,t){if(!t){let t=e;return e=>isIncoming(e,t)}let n=e;return isDescendantOf(n.target,t)&&!isDescendantOf(n.source,t)}function isAnyInOut(e,t){if(!t){let t=e;return e=>isAnyInOut(e,t)}let n=e;return isDescendantOf(n.source,t)!==isDescendantOf(n.target,t)}var ya=class ConnectionModel{source;target;relations;id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,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,Ge(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)}[_a](e,t,n){let r=this.toString();return Object.defineProperty(r,"constructor",{value:ConnectionModel,enumerable:!1}),r}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
|
|
21
|
+
`)}reversed(){return new ConnectionModel(this.target,this.source)}},ba=n({findConnection:()=>findConnection$4,findConnectionsBetween:()=>findConnectionsBetween$4,findConnectionsWithin:()=>findConnectionsWithin$3});function findConnection$4(e,t,n=`directed`){if(e===t||isSameHierarchy(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new va(e,t,r)]:[];return n===`directed`?i:[...i,...findConnection$4(t,e,`directed`)]}t(findConnection$4,`findConnection`);function findConnectionsBetween$4(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of findConnection$4(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}t(findConnectionsBetween$4,`findConnectionsBetween`);function findConnectionsWithin$3(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...findConnectionsBetween$4(t,r.slice(n+1),`both`)),e),[])}t(findConnectionsWithin$3,`findConnectionsWithin`);var xa=n({findConnection:()=>findConnection$3,findConnectionsBetween:()=>findConnectionsBetween$3,findConnectionsWithin:()=>findConnectionsWithin$2});function findConnection$3(e,t,n=`directed`){if(e===t||isSameHierarchy(e,t))return[];let r=intersection(e.allOutgoing,t.allIncoming),i=r.size>0?new ya(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=intersection(e.allIncoming,t.allOutgoing),o=a.size>0?new ya(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}t(findConnection$3,`findConnection`);function findConnectionsBetween$3(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of findConnection$3(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}t(findConnectionsBetween$3,`findConnectionsBetween`);function findConnectionsWithin$2(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...findConnectionsBetween$3(t,r.slice(n+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 Sa=e(zt(),1);const Ca=ea.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,ui.availableParallelism()-2)}get dotpath(){return this._dotpath??memoizeProp(this,`_dotpath`,()=>{let e=Sa.default.sync(`dot`);return Ca.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??memoizeProp(this,`_unflattenpath`,()=>{let e=Sa.default.sync(`unflatten`);return Ca.debug`Found ${e}`,e})}async unflatten(e){let t,n=Ca.getChild([`unflatten`,Te(4)]);try{let r=await Rt(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=r.stdout,S(r.stderr)?n.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):n.warn(`{command} has stderr:
|
|
22
|
+
`+r.stderr,{command:r.command})}catch(r){n.debug(`FAILED DOT`,{dot:e}),n.error(loggable(r)),r instanceof Lt&&!S(r.stdout)&&(n.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
23
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),t=r.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=Ca.getChild([`layoutJson`,Te(4)]),n;try{let r=await Rt(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,S(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
|
|
24
|
+
`+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(r)),r instanceof Lt&&!S(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
25
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=Ca.getChild([`svg`,Te(4)]),n;try{let r=await Rt(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,S(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
|
|
26
|
+
`+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(r)),r instanceof Lt&&!S(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
27
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}};const J=ea.getChild(`server`);function logWarnError(e){J.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=errorFromLogRecord(n);i?e.telemetry.logEvent({eventName:`error`,message:`${i.name}: ${i.message}`,category:r,...i.stack&&{stack:i.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(n),category:r});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=mi?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!mi;configureLogger$1({reset:!0,sinks:{console:n?getConsoleStderrSink({formatter:getTextFormatter()}):getConsoleSink({formatter:a?getAnsiColorFormatter():getTextFormatter(),nonBlocking:i}),...o&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),J.trace(`logger configured`)}var wa=e(nr(),1);const Ta=/^@[A-Za-z0-9_-]*$/,Ea=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,Da=L.string().min(1,`Image alias key cannot be empty`).regex(Ta,`Image alias key must match /^@\\w+$/`),Oa=L.string().min(1,`Image alias value cannot be empty`).regex(Ea,`Image alias value must be a relative path (no leading slash or protocol)`),ka=L.record(Da,Oa).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).`}),Aa=L.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)`),ja=L.strictObject({paths:L.array(Aa).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(`
|
|
28
|
+
`)}),maxDepth:L.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(`
|
|
29
|
+
`)}),fileThreshold:L.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(`
|
|
30
30
|
`)})}).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(`
|
|
31
|
-
`)}),
|
|
32
|
-
(must be a valid color name from the theme)`}),opacity:
|
|
33
|
-
(must be a valid color name from the theme)`}),line:
|
|
34
|
-
These values will be used if such property is not defined`}),
|
|
35
|
-
(must be a valid color name from the theme)`}),opacity:
|
|
36
|
-
These values will be used if such property is not defined`}),relationship:
|
|
37
|
-
These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`})
|
|
38
|
-
These values will be used if such property is not defined`}),customCss
|
|
39
|
-
`)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),
|
|
40
|
-
`)}),implicitViews:
|
|
41
|
-
`+
|
|
42
|
-
`+
|
|
43
|
-
`+
|
|
31
|
+
`)}),Ma=L.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%`}),Na=L.enum(ji).meta({id:`ElementShape`}),Pa=L.enum(Ai).meta({id:`BorderStyle`}),Fa=L.enum(Oi).meta({id:`ElementSize`}),Ia=L.enum(ki).meta({id:`IconPosition`}),La=L.enum(Xi).meta({id:`ArrowType`}),Ra=L.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),za=L.enum(Mi).meta({id:`ThemeColorName`}),Ba=L.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),Va=za.or(Ba).transform(e=>e).meta({id:`ColorName`}),Ha=L.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),Ua=L.strictObject({fill:Ha.meta({description:`Background color`}),stroke:Ha.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Ha.meta({description:`High contrast text color (title)`}),loContrast:Ha.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),Wa=L.strictObject({line:Ha.meta({description:`Line color`}),label:Ha.meta({description:`Label text color`}),labelBg:Ha.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),Ga=L.strictObject({elements:Ua.or(Ha.transform(e=>computeColorValues(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:Wa.or(Ha.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(Ha.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`}),Ka=L.partialRecord(Va,Ga).transform(e=>e),qa=L.strictObject({width:L.number().min(50),height:L.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),Ja=L.partialRecord(Fa,qa),Ya=L.strictObject({colors:Ka.optional().meta({description:`Override theme colors`}),sizes:Ja.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})),Xa=L.strictObject({color:Va.optional().meta({description:`Default color for groups
|
|
32
|
+
(must be a valid color name from the theme)`}),opacity:Ma.optional().meta({description:`Default opacity for groups`}),border:Pa.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),Za=L.strictObject({color:Va.optional().meta({description:`Default color for relationships
|
|
33
|
+
(must be a valid color name from the theme)`}),line:Ra.optional().meta({description:`Default line style for relationships`}),arrow:La.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
|
|
34
|
+
These values will be used if such property is not defined`}),Qa=L.strictObject({color:Va.optional().meta({description:`Default color for elements
|
|
35
|
+
(must be a valid color name from the theme)`}),opacity:Ma.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:Pa.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:Fa.optional().meta({description:`Default size for elements`}),shape:Na.optional().meta({description:`Default shape for elements`}),iconPosition:Ia.optional().meta({description:`Default icon position for elements`}),group:Xa.optional().meta({description:`Override default values for group style properties
|
|
36
|
+
These values will be used if such property is not defined`}),relationship:Za.optional().meta({description:`Override default values for relationship style properties
|
|
37
|
+
These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),$a=L.union([L.string().min(1,`Custom CSS file path cannot be empty`),L.array(L.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),eo=L.strictObject({theme:Ya.optional().meta({description:`Project theme customization`}),defaults:Qa.optional().meta({description:`Override default values for style properties
|
|
38
|
+
These values will be used if such property is not defined`}),customCss:$a.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>exact({defaults:normalizeDefaults(t),customCss:normalizeStylesheets(n),theme:e}));function normalizeDefaults(e){if(!e)return;let{relationship:t,group:n,...r}=e;return exact({...r,relationship:t&&exact(t),group:n&&exact(n)})}function normalizeStylesheets(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const to=L.strictObject({outDir:L.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(`
|
|
39
|
+
`)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),no=L.union([L.strictObject({redirect:L.literal(!0)}),L.strictObject({include:L.array(L.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`include list cannot be empty`)}),L.strictObject({exclude:L.array(L.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.`}),ro=L.object({name:L.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:L.union([L.string().min(1,`Extend path cannot be empty`),L.array(L.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:L.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:L.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:L.record(L.string(),L.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:eo.optional().meta({description:`Project styles customization`}),imageAliases:ka.optional(),include:ja.optional(),exclude:L.array(L.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:to.optional(),inferTechnologyFromIcon:L.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(`
|
|
40
|
+
`)}),implicitViews:L.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`}),landingPage:no.optional()}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),io=L.instanceof(Function),ao=L.record(L.string(),io);ro.extend({generators:ao.optional()});function validateProjectConfig(e){let t=e.landingPage,n=null;if(t!=null){let e=no.safeParse(t);if(!e.success)throw Error(`Config validation failed:
|
|
41
|
+
`+L.prettifyError(e.error));n=e.data}let r=ro.safeParse(e);if(!r.success)throw Error(`Config validation failed:
|
|
42
|
+
`+L.prettifyError(r.error));let i=r.data;n!==null&&(i={...i,landingPage:n});let a=e.generators;if(typeof a==`object`&&a&&!Array.isArray(a)){let e=ao.safeParse(a);if(!e.success)throw Error(`Config validation failed (generators):
|
|
43
|
+
`+L.prettifyError(e.error));return{...i,generators:e.data}}return i}function parseProjectConfigJSON(e){return validateProjectConfig(wa.default.parse(e.trim()||`{}`))}const oo={parse:parseProjectConfigJSON,validate:validateProjectConfig,normalizeInclude:e=>{let t=ja.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),n=splitPath(t);return n[n.length-1]||t}t(basename$1,`basename`);const so=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],co=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...so,...co];function isLikeC4JsonConfig(e){return so.includes(basename$1(e))}function isLikeC4NonJsonConfig(e){return co.includes(basename$1(e))}function isLikeC4Config(e){return isLikeC4JsonConfig(e)||isLikeC4NonJsonConfig(e)}const lo=ro.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await si.readFile(e,`utf-8`),n;try{n=wa.default.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=lo.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+L.prettifyError(r.error));return r.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await parseJsonConfig(e),r=normalizeExtends(n.extends),i=[...t,e],a=[];for(let t of r){let n=ii(ni(e),t);a.push(...await loadJsonConfigs(n,i))}return[...a,n]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,ea.getChild(`config`).debug`Loading config: ${ri(ai(),e)}`;let t=ni(e),n=ti(e),r={name:ti(t)};if(isLikeC4JsonConfig(n)){let t=await loadJsonConfigs(ii(e),[]);invariant(D(t,1),`Expect at least one config`);let n=ne(Ce(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(o),a=i.length>0?nt({},...i.reverse()):void 0;return validateProjectConfig({...r,...n,...a?{styles:a}:{}})}invariant(isLikeC4NonJsonConfig(n),`Invalid name for config file: ${e}`);let{mod:i}=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)ea.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
|
|
44
44
|
// Mock implementation to allow loading config files without bundling @likec4/config
|
|
45
45
|
function mock(x) { return x }
|
|
46
46
|
export {
|
|
@@ -49,52 +49,260 @@ export {
|
|
|
49
49
|
mock as defineStyle,
|
|
50
50
|
mock as defineTheme,
|
|
51
51
|
mock as defineThemeColor,
|
|
52
|
-
}`,loader:`js`}))}}]}});return validateProjectConfig(Object.assign(r,i?.default??i))}const Ba=[`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(`
|
|
53
|
-
`),Va=`likec4builtin`,Ha=`${Va}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===Va}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}var Ua=e(nr(),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(){if(this.isDisposed)throw Error(`This has already been disposed`)}};const Wa=`AnyProperty`;function isAnyProperty(e){return q.isInstance(e,Wa)}const Ga=`ColorLiteral`;function isColorLiteral(e){return q.isInstance(e,Ga)}const Ka=`DeploymentElement`;function isDeploymentElement(e){return q.isInstance(e,Ka)}const qa=`DeploymentNodeOrElementKind`,Ja=`DeploymentViewRule`;function isDeploymentViewRule(e){return q.isInstance(e,Ja)}const Ya=`DynamicViewProperty`,Xa=`DynamicViewRule`;function isDynamicViewRule(e){return q.isInstance(e,Xa)}const Za=`DynamicViewStep`;function isDynamicViewStep(e){return q.isInstance(e,Za)}const Qa=`ElementProperty`;function isElementProperty(e){return q.isInstance(e,Qa)}const $a=`ExpressionV2`;function isExpressionV2(e){return q.isInstance(e,$a)}const eo=`FqnExpr`;function isFqnExpr(e){return q.isInstance(e,eo)}const to=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return q.isInstance(e,to)}const no=`FqnExprOrWith`;function isFqnExprOrWith(e){return q.isInstance(e,no)}const ro=`FqnReferenceable`,io=`LikeC4View`;function isLikeC4View(e){return q.isInstance(e,io)}const ao=`MetadataProperty`;function isMetadataProperty(e){return q.isInstance(e,ao)}const oo=`MetadataValue`,so=`Referenceable`,co=`RelationExpr`;function isRelationExpr(e){return q.isInstance(e,co)}const lo=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return q.isInstance(e,lo)}const uo=`RelationExprOrWith`;function isRelationExprOrWith(e){return q.isInstance(e,uo)}const fo=`RelationProperty`,po=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return q.isInstance(e,po)}const mo=`SizeProperty`;function isSizeProperty(e){return q.isInstance(e,mo)}const ho=`StringProperty`;function isStringProperty(e){return q.isInstance(e,ho)}const go=`StyleProperty`;function isStyleProperty(e){return q.isInstance(e,go)}const _o=`ViewProperty`;function isViewProperty(e){return q.isInstance(e,_o)}const vo=`ViewRule`;function isViewRule(e){return q.isInstance(e,vo)}const yo=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return q.isInstance(e,yo)}const bo=`WhereElement`;function isWhereElement(e){return q.isInstance(e,bo)}const xo=`WhereElementExpression`;function isWhereElementExpression(e){return q.isInstance(e,xo)}const So=`WhereExpression`,Co=`WhereKindEqual`;function isWhereKindEqual(e){return q.isInstance(e,Co)}const wo=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return q.isInstance(e,wo)}const To=`WhereRelation`;function isWhereRelation(e){return q.isInstance(e,To)}const Eo=`WhereRelationExpression`;function isWhereRelationExpression(e){return q.isInstance(e,Eo)}const Do=`WhereTagEqual`;function isWhereTagEqual(e){return q.isInstance(e,Do)}const Oo=`AbstractDynamicStep`,ko=`ArrowProperty`;function isArrowProperty(e){return q.isInstance(e,ko)}const Ao=`BorderProperty`;function isBorderProperty(e){return q.isInstance(e,Ao)}const jo=`ColorProperty`;function isColorProperty(e){return q.isInstance(e,jo)}const Mo=`CustomColor`,No=`CustomElementProperties`;function isCustomElementProperties(e){return q.isInstance(e,No)}const Po=`CustomRelationProperties`;function isCustomRelationProperties(e){return q.isInstance(e,Po)}const Fo=`DeployedInstance`;function isDeployedInstance(e){return q.isInstance(e,Fo)}const Io=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return q.isInstance(e,Io)}const Lo=`DeploymentNode`;function isDeploymentNode(e){return q.isInstance(e,Lo)}const Ro=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return q.isInstance(e,Ro)}const zo=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return q.isInstance(e,zo)}const Bo=`DeploymentRelation`;function isDeploymentRelation(e){return q.isInstance(e,Bo)}const Vo=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return q.isInstance(e,Vo)}const Ho=`DeploymentView`;function isDeploymentView(e){return q.isInstance(e,Ho)}const Uo=`DeploymentViewBody`;function isDeploymentViewBody(e){return q.isInstance(e,Uo)}const Wo=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return q.isInstance(e,Wo)}const Go=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return q.isInstance(e,Go)}const Ko=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return q.isInstance(e,Ko)}const qo=`DynamicView`;function isDynamicView(e){return q.isInstance(e,qo)}const Jo=`DynamicViewBody`;function isDynamicViewBody(e){return q.isInstance(e,Jo)}const Yo=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return q.isInstance(e,Yo)}const Xo=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return q.isInstance(e,Xo)}const Zo=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return q.isInstance(e,Zo)}const Qo=`DynamicViewParallelSteps`;function isDynamicViewParallelSteps(e){return q.isInstance(e,Qo)}const $o=`DynamicViewRef`,es=`Element`;function isElement(e){return q.isInstance(e,es)}const ts=`ElementBody`;function isElementBody(e){return q.isInstance(e,ts)}const ns=`ElementKind`;function isElementKind(e){return q.isInstance(e,ns)}const rs=`ElementKindExpression`;function isElementKindExpression(e){return q.isInstance(e,rs)}const as=`ElementRef`;function isElementRef(e){return q.isInstance(e,as)}const os=`ElementStringProperty`;function isElementStringProperty(e){return q.isInstance(e,os)}const ss=`ElementStyleProperty`;function isElementStyleProperty(e){return q.isInstance(e,ss)}const cs=`ElementTagExpression`;function isElementTagExpression(e){return q.isInstance(e,cs)}const ls=`ElementView`;function isElementView(e){return q.isInstance(e,ls)}const us=`ElementViewBody`;function isElementViewBody(e){return q.isInstance(e,us)}const ds=`ElementViewRef`,fs=`Expressions`;function isExpressions(e){return q.isInstance(e,fs)}const ps=`ExtendDeployment`;function isExtendDeployment(e){return q.isInstance(e,ps)}const ms=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return q.isInstance(e,ms)}const hs=`ExtendElement`;function isExtendElement(e){return q.isInstance(e,hs)}const gs=`ExtendElementBody`;function isExtendElementBody(e){return q.isInstance(e,gs)}const _s=`ExtendRelation`;function isExtendRelation(e){return q.isInstance(e,_s)}const vs=`ExtendRelationBody`;function isExtendRelationBody(e){return q.isInstance(e,vs)}const ys=`FqnExpressions`;function isFqnExpressions(e){return q.isInstance(e,ys)}const bs=`FqnExprWhere`;function isFqnExprWhere(e){return q.isInstance(e,bs)}const xs=`FqnExprWith`;function isFqnExprWith(e){return q.isInstance(e,xs)}const Ss=`FqnRef`;function isFqnRef(e){return q.isInstance(e,Ss)}const Cs=`FqnRefExpr`;function isFqnRefExpr(e){return q.isInstance(e,Cs)}const ws=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return q.isInstance(e,ws)}const Ts=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return q.isInstance(e,Ts)}const Es=`Globals`;function isGlobals(e){return q.isInstance(e,Es)}const Ds=`GlobalStyle`;function isGlobalStyle(e){return q.isInstance(e,Ds)}const Os=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return q.isInstance(e,Os)}const ks=`GlobalStyleId`,As=`HexColor`;function isHexColor(e){return q.isInstance(e,As)}const js=`IconColorProperty`;function isIconColorProperty(e){return q.isInstance(e,js)}const Ms=`IconPositionProperty`;function isIconPositionProperty(e){return q.isInstance(e,Ms)}const Ns=`IconProperty`;function isIconProperty(e){return q.isInstance(e,Ns)}const Ps=`IconSizeProperty`;function isIconSizeProperty(e){return q.isInstance(e,Ps)}const Fs=`Imported`;function isImported(e){return q.isInstance(e,Fs)}const Is=`ImportsFromPoject`;function isImportsFromPoject(e){return q.isInstance(e,Is)}const Ls=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return q.isInstance(e,Ls)}const Rs=`InOutRelationExpr`;function isInOutRelationExpr(e){return q.isInstance(e,Rs)}const zs=`LibIcon`;function isLibIcon(e){return q.isInstance(e,zs)}const Bs=`LikeC4Grammar`;function isLikeC4Grammar(e){return q.isInstance(e,Bs)}const Vs=`LikeC4Lib`;function isLikeC4Lib(e){return q.isInstance(e,Vs)}const Hs=`LineProperty`;function isLineProperty(e){return q.isInstance(e,Hs)}const Us=`LinkProperty`;function isLinkProperty(e){return q.isInstance(e,Us)}const Ws=`MarkdownOrString`;function isMarkdownOrString(e){return q.isInstance(e,Ws)}const Gs=`MetadataArray`;function isMetadataArray(e){return q.isInstance(e,Gs)}const Ks=`MetadataAttribute`;function isMetadataAttribute(e){return q.isInstance(e,Ks)}const qs=`MetadataBody`;function isMetadataBody(e){return q.isInstance(e,qs)}const Js=`Model`;function isModel(e){return q.isInstance(e,Js)}const Ys=`ModelDeployments`;function isModelDeployments(e){return q.isInstance(e,Ys)}const Xs=`ModelViews`;function isModelViews(e){return q.isInstance(e,Xs)}const Zs=`MultipleProperty`;function isMultipleProperty(e){return q.isInstance(e,Zs)}const Qs=`NavigateToProperty`;function isNavigateToProperty(e){return q.isInstance(e,Qs)}const $s=`NotationProperty`;function isNotationProperty(e){return q.isInstance(e,$s)}const ec=`NotesProperty`;function isNotesProperty(e){return q.isInstance(e,ec)}const tc=`OpacityProperty`;function isOpacityProperty(e){return q.isInstance(e,tc)}const nc=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return q.isInstance(e,nc)}const rc=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return q.isInstance(e,rc)}const ic=`Relation`;function isRelation(e){return q.isInstance(e,ic)}const ac=`RelationBody`;function isRelationBody(e){return q.isInstance(e,ac)}const oc=`RelationExprWhere`;function isRelationExprWhere(e){return q.isInstance(e,oc)}const sc=`RelationExprWith`;function isRelationExprWith(e){return q.isInstance(e,sc)}const cc=`RelationKindDotRef`;function isRelationKindDotRef(e){return q.isInstance(e,cc)}const lc=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return q.isInstance(e,lc)}const uc=`RelationshipKind`;function isRelationshipKind(e){return q.isInstance(e,uc)}const dc=`RelationStringProperty`;function isRelationStringProperty(e){return q.isInstance(e,dc)}const fc=`RelationStyleProperty`;function isRelationStyleProperty(e){return q.isInstance(e,fc)}const pc=`RGBAColor`;function isRGBAColor(e){return q.isInstance(e,pc)}const mc=`ShapeProperty`;function isShapeProperty(e){return q.isInstance(e,mc)}const hc=`ShapeSizeProperty`;function isShapeSizeProperty(e){return q.isInstance(e,hc)}const gc=`SpecificationColor`;function isSpecificationColor(e){return q.isInstance(e,gc)}const _c=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return q.isInstance(e,_c)}const vc=`SpecificationElementKind`;function isSpecificationElementKind(e){return q.isInstance(e,vc)}const yc=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return q.isInstance(e,yc)}const bc=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return q.isInstance(e,bc)}const xc=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return q.isInstance(e,xc)}const Sc=`SpecificationRule`;function isSpecificationRule(e){return q.isInstance(e,Sc)}const Cc=`SpecificationTag`;function isSpecificationTag(e){return q.isInstance(e,Cc)}const wc=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return q.isInstance(e,wc)}const Tc=`StrictFqnRef`;function isStrictFqnRef(e){return q.isInstance(e,Tc)}function isTag(e){return q.isInstance(e,`Tag`)}const Ec=`TagRef`;function isTagRef(e){return q.isInstance(e,Ec)}const Dc=`Tags`;function isTags(e){return q.isInstance(e,Dc)}const Oc=`TextSizeProperty`;function isTextSizeProperty(e){return q.isInstance(e,Oc)}const kc=`ViewRef`,Ac=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return q.isInstance(e,Ac)}const jc=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return q.isInstance(e,jc)}const Mc=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return q.isInstance(e,Mc)}const Nc=`ViewRuleGroup`;function isViewRuleGroup(e){return q.isInstance(e,Nc)}const Pc=`ViewRulePredicate`;function isViewRulePredicate(e){return q.isInstance(e,Pc)}const Fc=`ViewRuleRank`;function isViewRuleRank(e){return q.isInstance(e,Fc)}const Ic=`ViewRuleStyle`;function isViewRuleStyle(e){return q.isInstance(e,Ic)}const Lc=`ViewStringProperty`;function isViewStringProperty(e){return q.isInstance(e,Lc)}const Rc=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return q.isInstance(e,Rc)}const zc=`WhereElementKind`;function isWhereElementKind(e){return q.isInstance(e,zc)}const Bc=`WhereElementMetadata`;function isWhereElementMetadata(e){return q.isInstance(e,Bc)}const Vc=`WhereElementNegation`;function isWhereElementNegation(e){return q.isInstance(e,Vc)}const Hc=`WhereElementTag`;function isWhereElementTag(e){return q.isInstance(e,Hc)}const Uc=`WhereRelationKind`;function isWhereRelationKind(e){return q.isInstance(e,Uc)}const Wc=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return q.isInstance(e,Wc)}const Gc=`WhereRelationNegation`;function isWhereRelationNegation(e){return q.isInstance(e,Gc)}const Kc=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return q.isInstance(e,Kc)}const qc=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return q.isInstance(e,qc)}const Jc=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return q.isInstance(e,Jc)}const Yc=`WhereRelationTag`;function isWhereRelationTag(e){return q.isInstance(e,Yc)}const Xc=`WildcardExpression`;function isWildcardExpression(e){return q.isInstance(e,Xc)}const Zc=`DynamicStepChain`;function isDynamicStepChain(e){return q.isInstance(e,Zc)}const Qc=`DynamicStepSingle`;function isDynamicStepSingle(e){return q.isInstance(e,Qc)}var LikeC4AstReflection=class extends bn{getAllTypes(){return[Oo,Wa,ko,Ao,Ga,jo,Mo,No,Po,Fo,Io,Ka,Lo,Ro,zo,qa,Bo,Vo,Ho,Uo,Ja,Wo,Go,Ko,Zc,Qc,qo,Jo,Yo,Xo,Zo,Qo,Ya,$o,Xa,Za,es,ts,ns,rs,Qa,as,os,ss,cs,ls,us,ds,$a,fs,ps,ms,hs,gs,`ExtendElementProperty`,_s,vs,`ExtendRelationProperty`,eo,to,no,bs,xs,ys,Ss,Cs,ro,ws,Ts,Ds,Os,ks,Es,As,js,Ms,Ns,Ps,Fs,Is,Rs,Ls,zs,Bs,Vs,io,Hs,Us,Ws,Gs,Ks,qs,ao,oo,Js,Ys,`ModelReferenceable`,Xs,Zs,Qs,$s,ec,tc,nc,rc,pc,so,ic,ac,co,lo,uo,oc,sc,cc,lc,fo,dc,fc,uc,po,mc,hc,mo,gc,_c,vc,yc,bc,xc,Sc,Cc,wc,Tc,ho,go,`Tag`,Ec,Dc,Oc,_o,kc,vo,Ac,jc,Mc,Nc,Pc,Fc,Ic,yo,Lc,Rc,bo,xo,zc,Bc,Vc,Hc,So,Co,wo,To,Eo,Uc,Wc,Gc,Kc,qc,Jc,Yc,Do,Xc]}computeIsSubtype(e,t){switch(e){case ko:case Hs:return this.isSubtype(po,t);case Ao:case js:case Ms:case Zs:case tc:case mc:return this.isSubtype(go,t);case jo:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case Fo:case Lo:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case zo:case ns:return this.isSubtype(qa,t);case Ho:case qo:case ls:return this.isSubtype(io,t);case Wo:case Go:return this.isSubtype(Ja,t);case Ko:case Ls:case Rs:case nc:return this.isSubtype(co,t);case Zc:case Qc:return this.isSubtype(`AbstractDynamicStep`,t)||this.isSubtype(`DynamicViewStep`,t);case Yo:return this.isSubtype(Ya,t);case Xo:case Zo:return this.isSubtype(Xa,t);case Ya:case Qa:case Qs:case fo:case po:case ho:case go:return this.isSubtype(Wa,t);case es:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case rs:case cs:case Cs:case Xc:return this.isSubtype(eo,t);case os:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case ss:return this.isSubtype(Qa,t);case ps:case hs:case so:return this.isSubtype(ro,t);case eo:case bs:return this.isSubtype(to,t);case to:case xs:return this.isSubtype(no,t);case no:case uo:return this.isSubtype($a,t);case As:case pc:return this.isSubtype(Ga,t);case Ns:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case Ps:case rc:case hc:case Oc:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case Fs:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Us:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case Ws:case Gs:return this.isSubtype(oo,t);case Ks:case yc:case xc:return this.isSubtype(ho,t);case qs:return this.isSubtype(ao,t);case ao:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case $s:case ec:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`StringProperty`,t);case co:case oc:return this.isSubtype(lo,t);case lo:case sc:return this.isSubtype(uo,t);case lc:case fc:return this.isSubtype(fo,t);case dc:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case _o:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case Ac:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case jc:case Nc:case Pc:case Fc:return this.isSubtype(vo,t);case Mc:case Ic:return this.isSubtype(yo,t);case yo:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Lc:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case Rc:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case bo:case Vc:return this.isSubtype(xo,t);case xo:case Eo:return this.isSubtype(So,t);case zc:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Bc:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case Hc:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case To:case Gc:return this.isSubtype(Eo,t);case Uc:case Kc:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case Wc:case qc:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case Jc:case Yc: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 uc;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Mo;case`DeploymentNode:kind`:return zo;case`DynamicViewGlobalPredicateRef:predicate`:return ws;case`DynamicViewRef:view`:return qo;case`Element:kind`:case`ElementKindExpression:kind`:return ns;case`ElementViewRef:view`:return ls;case`FqnRef:value`:case`StrictFqnRef:value`:return so;case`IconProperty:libicon`:return zs;case`Imported:imported`:case`StrictFqnElementRef:el`:return es;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return io;case`ViewRuleGlobalPredicateRef:predicate`:return Ts;case`ViewRuleGlobalStyle:style`:return ks;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return qa;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Oo:return{name:Oo,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case ko:return{name:ko,properties:[{name:`key`},{name:`value`}]};case Ao:return{name:Ao,properties:[{name:`key`},{name:`value`}]};case jo:return{name:jo,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Mo:return{name:Mo,properties:[{name:`name`}]};case No:return{name:No,properties:[{name:`props`,defaultValue:[]}]};case Po:return{name:Po,properties:[{name:`props`,defaultValue:[]}]};case Fo:return{name:Fo,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Io:return{name:Io,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Lo:return{name:Lo,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Ro:return{name:Ro,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case zo:return{name:zo,properties:[{name:`name`}]};case Bo:return{name:Bo,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Vo:return{name:Vo,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ho:return{name:Ho,properties:[{name:`body`},{name:`name`}]};case Uo:return{name:Uo,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Wo:return{name:Wo,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Go:return{name:Go,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Ko:return{name:Ko,properties:[{name:`source`},{name:`target`}]};case qo:return{name:qo,properties:[{name:`body`},{name:`name`}]};case Jo:return{name:Jo,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case Yo:return{name:Yo,properties:[{name:`key`},{name:`value`}]};case Xo:return{name:Xo,properties:[{name:`predicate`}]};case Zo:return{name:Zo,properties:[{name:`exprs`}]};case Qo:return{name:Qo,properties:[{name:`steps`,defaultValue:[]}]};case $o:return{name:$o,properties:[{name:`view`}]};case es:return{name:es,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case ts:return{name:ts,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ns:return{name:ns,properties:[{name:`name`}]};case rs:return{name:rs,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case as:return{name:as,properties:[{name:`modelElement`}]};case os:return{name:os,properties:[{name:`key`},{name:`value`}]};case ss:return{name:ss,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case cs:return{name:cs,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case ls:return{name:ls,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case us:return{name:us,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case ds:return{name:ds,properties:[{name:`view`}]};case fs:return{name:fs,properties:[{name:`prev`},{name:`value`}]};case ps:return{name:ps,properties:[{name:`body`},{name:`deploymentNode`}]};case ms:return{name:ms,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case hs:return{name:hs,properties:[{name:`body`},{name:`element`}]};case gs:return{name:gs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case _s:return{name:_s,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case vs:return{name:vs,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ys:return{name:ys,properties:[{name:`prev`},{name:`value`}]};case bs:return{name:bs,properties:[{name:`subject`},{name:`where`}]};case xs:return{name:xs,properties:[{name:`custom`},{name:`subject`}]};case Ss:return{name:Ss,properties:[{name:`parent`},{name:`value`}]};case Cs:return{name:Cs,properties:[{name:`ref`},{name:`selector`}]};case ws:return{name:ws,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ts:return{name:Ts,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Es:return{name:Es,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Ds:return{name:Ds,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Os:return{name:Os,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case ks:return{name:ks,properties:[{name:`name`}]};case As:return{name:As,properties:[{name:`hex`}]};case js:return{name:js,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Ms:return{name:Ms,properties:[{name:`key`},{name:`value`}]};case Ns:return{name:Ns,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Ps:return{name:Ps,properties:[{name:`key`},{name:`value`}]};case Fs:return{name:Fs,properties:[{name:`imported`},{name:`prev`}]};case Is:return{name:Is,properties:[{name:`imports`},{name:`project`}]};case Ls:return{name:Ls,properties:[{name:`to`}]};case Rs:return{name:Rs,properties:[{name:`inout`}]};case zs:return{name:zs,properties:[{name:`name`}]};case Bs:return{name:Bs,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Vs:return{name:Vs,properties:[{name:`icons`,defaultValue:[]}]};case Hs:return{name:Hs,properties:[{name:`key`},{name:`value`}]};case Us:return{name:Us,properties:[{name:`key`},{name:`title`},{name:`value`}]};case Ws:return{name:Ws,properties:[{name:`markdown`},{name:`text`}]};case Gs:return{name:Gs,properties:[{name:`values`,defaultValue:[]}]};case Ks:return{name:Ks,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case qs:return{name:qs,properties:[{name:`props`,defaultValue:[]}]};case Js:return{name:Js,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Ys:return{name:Ys,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Xs:return{name:Xs,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Zs:return{name:Zs,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Qs:return{name:Qs,properties:[{name:`key`},{name:`value`}]};case $s:return{name:$s,properties:[{name:`key`},{name:`value`}]};case ec:return{name:ec,properties:[{name:`key`},{name:`value`}]};case tc:return{name:tc,properties:[{name:`key`},{name:`value`}]};case nc:return{name:nc,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case rc:return{name:rc,properties:[{name:`key`},{name:`value`}]};case ic:return{name:ic,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case ac:return{name:ac,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case oc:return{name:oc,properties:[{name:`subject`},{name:`where`}]};case sc:return{name:sc,properties:[{name:`custom`},{name:`subject`}]};case cc:return{name:cc,properties:[{name:`kind`}]};case lc:return{name:lc,properties:[{name:`key`},{name:`value`}]};case uc:return{name:uc,properties:[{name:`name`}]};case dc:return{name:dc,properties:[{name:`key`},{name:`value`}]};case fc:return{name:fc,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case pc:return{name:pc,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case mc:return{name:mc,properties:[{name:`key`},{name:`value`}]};case hc:return{name:hc,properties:[{name:`key`},{name:`value`}]};case gc:return{name:gc,properties:[{name:`color`},{name:`name`}]};case _c:return{name:_c,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case vc:return{name:vc,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case yc:return{name:yc,properties:[{name:`key`},{name:`value`}]};case bc:return{name:bc,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case xc:return{name:xc,properties:[{name:`key`},{name:`value`}]};case Sc:return{name:Sc,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case Cc:return{name:Cc,properties:[{name:`color`},{name:`tag`}]};case wc:return{name:wc,properties:[{name:`el`},{name:`parent`}]};case Tc:return{name:Tc,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Ec:return{name:Ec,properties:[{name:`tag`}]};case Dc:return{name:Dc,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Oc:return{name:Oc,properties:[{name:`key`},{name:`value`}]};case kc:return{name:kc,properties:[{name:`view`}]};case Ac:return{name:Ac,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case jc:return{name:jc,properties:[{name:`predicate`}]};case Mc:return{name:Mc,properties:[{name:`style`}]};case Nc:return{name:Nc,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Pc:return{name:Pc,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Fc:return{name:Fc,properties:[{name:`targets`},{name:`value`}]};case Ic:return{name:Ic,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Lc:return{name:Lc,properties:[{name:`key`},{name:`value`}]};case Rc:return{name:Rc,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case zc:return{name:zc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Bc:return{name:Bc,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Vc:return{name:Vc,properties:[{name:`value`}]};case Hc:return{name:Hc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Uc:return{name:Uc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Wc:return{name:Wc,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Gc:return{name:Gc,properties:[{name:`value`}]};case Kc:return{name:Kc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case qc:return{name:qc,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Jc:return{name:Jc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Yc:return{name:Yc,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Xc:return{name:Xc,properties:[{name:`isWildcard`,defaultValue:!1}]};case Zc:return{name:Zc,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Qc:return{name:Qc,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const q=new LikeC4AstReflection;let $c;const LikeC4Grammar=()=>$c??=An(`{"$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@123"},"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@161"},"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@165"},"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@165"},"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@165"},"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@164"},"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@165"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"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@163"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"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@158"},"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@158"},"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@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@186"},"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@165"},"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@165"},"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@150"},"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@150"},"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@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"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@163"},"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@129"},"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@151"},"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@186"},"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@129"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@151"},"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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@129"},"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@163"},"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@149"},"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@189"},"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@172"},"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@163"},"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@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@186"},"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@165"},"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@165"},"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@154"},"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@129"},"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@163"},"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@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@151"},"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@151"},"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@124"},"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@125"},"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@145"},"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@126"},"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@188"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"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@163"},"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@163"},"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@145"},"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@149"},"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@167"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"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@177"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"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@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@151"},"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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@165"},"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@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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@124"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"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@189"},"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@189"},"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@189"},"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@126"},"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@145"},"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@126"},"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@162"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@184"},"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@172"},"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@161"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"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@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@141"},"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@136"},"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@156"},"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@152"},"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@139"},"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@141"},"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@141"},"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@141"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"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@145"},"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@152"},"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@153"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"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@179"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"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@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"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@185"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"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@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"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@183"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@183"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@149"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@145"}}]}},{"$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@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@135"}}]}}],"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@151"}}},{"$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":[]}`),el={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},tl={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},nl={AstReflection:()=>new LikeC4AstReflection},rl={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>el,parser:{ParserConfig:()=>tl}},il=Symbol.for(`idattr`),al={writeId(e,t){return e[il]=t,e},readId(e){return e[il]}},ol={writeId(e,t){return g(t)?e[il]=void 0:e[il]=t,e},readId(e){return e[il]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===el.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:Ne(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 n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case isColorProperty(r):{let e=toColor(r);_(e)&&(n.color=e);break}case isLineProperty(r):n.line=r.value;break;case isArrowProperty(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:nonexhaustive(r)}break;default:nonexhaustive(r)}return n}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:nonexhaustive(e.direction)}return{direction:r,...n&&{nodeSep:n},...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 cn(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),sl=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(sl(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(sl(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(sl(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],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function 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(g(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(g(e.parent))return!1;e=e.parent}return!1}var AstNodeDescriptionProvider=class extends In{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=qt(e);let r=super.createDescription(e,t,n);return isLikeC4Builtin(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},IndexManager=class extends xn{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return ln(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const cl=compareNaturalHierarchically(`/`),ll=t((e,t)=>cl(e.uri.path,t.uri.path),`ensureOrder`);var LangiumDocuments=class extends Dn{constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(ll);this.documentMap.clear();for(let e of n)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 ln(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return ln(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return ln(this.documentMap.values()).filter(n=>isLikeC4UserDocument(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return D(this.userDocuments.toArray(),y(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),oe(S(`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 J=K.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`?mr(e,{acceptRelative:!1,strict:!0})?e:N.file(e).toString():e.toString()}const ul=compareNaturalHierarchically(`/`,!0),compareUri=(e,t)=>ul(lr(e.path),lr(t.path));function isParentFolderFor(e){return t=>e.startsWith(isString(t)?t:t.folder)}function _overlaps(e,t){let n=isString(e)?e:e.folder,r=isString(t)?t:t.folder;return n===r||n.startsWith(r)||r.startsWith(n)}function overlaps(...e){return le(_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?.(_r(t))??!1}function includes(...e){return le(_includes,e)}function excludes(...e){return le(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),hr(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:fe(e,compareProjectByFolder)}const dl={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,Ua.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return dl.exclude(_r(e))}function parseRegisterOptions(e){if(`configUri`in e){invariant(!ie(e.configUri),`configUri is emptyish`);let t=N.isUri(e.configUri)?e.configUri:N.parse(normalizeUri(e.configUri)),n=ProjectFolder(M.dirname(t));return{configUri:t,folder:n,folderUri:N.parse(n)}}invariant(!ie(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),n=N.parse(t);return{configUri:M.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var fl=class ProjectsManager{static DefaultProjectId=dl.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new O.default(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),n=M.joinPath(t,`likec4.config.json`),r=ProjectFolder(t);return{id:e,config:dl.config,folder:r,folderUri:N.parse(r),configUri:n,exclude:dl.exclude,includeConfig:{...dl.includeConfig}}}return nonNullable(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new O.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 O.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){this.services=e,J.trace`created`}isExcludedByWorkspace(e){return this.#n?(N.isUri(e)&&(e=normalizeUri(e)),this.#n(_r(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=D(e,w(_),y(e=>(!or(e)&&!e.startsWith(`**`)&&(e=pr(`**`,e)),e)));if(!T(t,1)){this.#n=void 0;return}J.debug`set workspace exclude patterns: ${t}`,this.#n=(0,Ua.default)(t,{dot:!0})}catch(e){J.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 T(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){J.debug`reset default project ID`;return}invariant(this.#r.find(t=>t.id===e),`Project "${e}" not found`),J.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(T(this.#r,1)){let e=[...y(this.#r,S(`id`)),dl.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[dl.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&&!!xe(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: [${y(this.#r,S(`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 n=normalizeUri(t);return this.isExcludedByWorkspace(n)?!1:T(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(n)&&!isExcludedByDefault(n):includes(this.#i.get(e),n):!isExcludedByDefault(n)}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: ${dl.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!Qt(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Ia.validate(e.config),{configUri:r,folder:i,folderUri:a}=parseRegisterOptions(e),o=Ia.normalizeInclude(n.include),s=this.#r.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(J.info`project name changed from ${s.config.name} to ${n.name}`,J.info`remove ${s.id}`,s.id=this.uniqueProjectId(n.name),J.info`add ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#r=ensureProjectsOrder([...this.#r,s]),J.info`add ${s.id}`),safeCall(()=>this.updateIncludesExcludes(s)),this.isInitiatingOrReloading?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>Qt(e)?Promise.reject(e):(J.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}relativePath(e){let t=normalizeUri(e),n=this.#o.get(t);return n?M.relative(n.folderUri,N.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(J.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(J.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(Qt(e)||J.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){J.warn(`Failed to reloadProjects, no workspace folders found`);return}J.debug`start reload projects`;let n=[];for(let e of t){let t=N.parse(e.uri);J.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)J.debug`found config ${M.relative(t,r.uri)}`,n.push(r.uri)}catch(e){J.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#r.length===0){J.warning(`No config files found`);return}J.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),J.warning(`reset`)}n.sort(compareUri);let r=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){J.warn(loggable(t));let n=r.get(e.toString());n&&(J.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{J.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(y(this.#r,S(`id`))),n=e;if(!t.has(n))return n;J.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){J.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 n=this.#r.find(t=>t.id===e);if(!n)return e===ProjectsManager.DefaultProjectId?J.info`Rebuilding all documents `:J.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let r=J.getChild(n.id),_includes=e=>includes(n,normalizeUri(e)),i=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(i.length===0){r.debug`no documents found for project ${n.id}, skipping rebuild`;return}r.info(`rebuild project documents: {docs}`,{docs:i.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(i,[],t).catch(e=>{r.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),wn.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return J.warn(`Failed to get workspace URI, using default folder`,{error:e}),N.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){J.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case g(t.exclude):e.exclude=dl.exclude;break;case t.exclude&&T(t.exclude,1):e.exclude=(0,Ua.default)(y(t.exclude,t=>(!ur(t)&&!t.startsWith(`**`)&&(t=pr(`**`,t)),gr(sr(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!T(n,1))return e;e.includePaths=y(n,t=>{let n=M.resolvePath(e.folderUri,t);return{uri:n,folder:ProjectFolder(n)}}),J.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#r)n.id!==e.id&&(overlaps(t,n)&&J.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{overlaps(t,r)&&J.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=y([e.configUri,t],M.basename);n!==r&&J.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}};function hasLikeC4Ext(e){return el.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const pl=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return pl.includes(e)}function insideNodeModulesOrRepo(e){for(let t of pl)if(e.includes(t))return!0;return!1}const ml=compareNaturalHierarchically(`/`);function ensureOrder(e,t){return ml(e.uri.path,t.uri.path)}var LikeC4WorkspaceManager=class extends vn{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 n of e)try{let e=N.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){logWarnError(e)}let n=this.services.workspace.ProjectsManager,r=0;for(let e of t)try{await n.registerConfigFile(e.uri),r++}catch(e){logWarnError(e)}return t.length!==r&&K.warn`loaded ${r} projects out of ${t.length}`,await super.performStartup(e)}finally{this.#e=!0}}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(Ba,N.parse(Ha)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=ne(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),i=0,a=[];for(let{projectId:e,includePath:t,includeConfig:i}of n)try{K.debug`scanning include path ${t.fsPath} for project ${e}`;let n=D(await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:i.maxDepth}),w(r));a.push(...n),n.length===0?K.trace`no files found in include path ${t.fsPath}`:K.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){K.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of be(a,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),i++}catch(t){K.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&i>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));i>e?K.warn(`Loaded ${i} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):K.info`loaded ${i} total files from ${n.length} include paths`}}async traverseFolder(e,t,n,r){let i=await this.fileSystemProvider.readDirectory(t,{recursive:!0});for(let t of i)if(this.includeEntry(e,t,n)){if(t.isDirectory){await this.traverseFolder(e,t.uri,n,r);continue}try{r(await this.langiumDocuments.getOrCreateDocument(t.uri))}catch(e){K.warn(`Failed to load document {path}`,{error:e,path:t.uri.fsPath})}}}includeEntry(e,t,n){let r=M.basename(t.uri);return t.isDirectory?!(isNodeModulesOrRepo(r)||this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri)):t.isFile?(n.fileExtensions.includes(M.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri):!1}workspace(){return this.folders&&T(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();K.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`),N.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),wn.create(()=>{this.#t=this.#t.filter(t=>t!==e)})}async readExcludeConfig(){if(!this.services.lsp.Connection){K.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>vr(e,{milliseconds:1e3,message:!1});try{K.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),K.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(K.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):K.trace(`no initial exclude configuration found`)}catch(e){K.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=Wn(e)?qt(e):e;return t.likec4ProjectId?t.likec4ProjectId:(K.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,fl.DefaultProjectId)}function stringHash(...e){return stringHash$1(e.length>1?e.join(`:::`):e[0])}function safeCall(e){try{return e()}catch(e){K.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 ar(performanceNow()-e)}}}var hl=rr();Ln();const gl=K.getChild(`manual-layouts`),_l=`.likec4.snap`,isManualLayoutFile=e=>e!==_l&&e.endsWith(_l);function fileName(e){return`${e}${_l}`}function viewIdFromURI(e){let t=M.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return M.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const vl={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},yl=`file://./`;var DefaultLikeC4ManualLayouts=class{cache;listeners=[];#e=It(1);constructor(e){this.services=e,this.cache=new hn,onNextTick(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async handleFileSystemUpdate(e){let t=e.update??e.delete,n=viewIdFromURI(t)??void 0,r=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(r),`delete`in e){this.triggerUpdate(exact({removed:t,projectId:r,viewId:n}));return}let i=this.services.workspace.ProjectsManager.getProject(r);if(!n){let e=await this.readSnapshot(t,i);e?n=e.id:(gl.error(`Snapshot ${t.fsPath} does not exist or is invalid`),n=`index`)}this.triggerUpdate({updated:t,projectId:r,viewId:n})}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=gl.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=getManualLayoutsOutDir(e),i=[];try{let a=await n.scanDirectory(r,isManualLayoutFile);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=ea.default.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.trace`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=h(i,S(`id`));return{hash:objectHash(a),views:a}}async readSnapshot(e,t){let n=this.services.workspace.FileSystemProvider;try{let r=await n.readFile(e),i=ea.default.parse(r);if(!t){let n=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(n)}return{...this.resolveIconPathsAfterRead(i,t.folderUri),_layout:`manual`}}catch(t){return gl.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 t;let n=await this.readManualLayouts(e);return this.cache.set(e.id,n),n})}async write(e,t){this.cache.delete(e.id);let n=gl.getChild(e.id),r=getManualLayoutsOutDir(e),i=M.joinPath(r,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=ea.default.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:_n.create(Hn.create(0,0),Hn.create(a.split(`
|
|
52
|
+
}`,loader:`js`}))}}]}});return validateProjectConfig(Object.assign(r,i?.default??i))}const uo=[`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(`
|
|
53
|
+
`),fo=`likec4builtin`,po=`${fo}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===fo}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}var mo=e(br(),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(){if(this.isDisposed)throw Error(`This has already been disposed`)}};const ho=`AnyProperty`;function isAnyProperty(e){return Y.isInstance(e,ho)}const go=`ColorLiteral`;function isColorLiteral(e){return Y.isInstance(e,go)}const _o=`DeploymentElement`;function isDeploymentElement(e){return Y.isInstance(e,_o)}const vo=`DeploymentNodeOrElementKind`,yo=`DeploymentViewRule`;function isDeploymentViewRule(e){return Y.isInstance(e,yo)}const bo=`DynamicViewProperty`,xo=`DynamicViewRule`;function isDynamicViewRule(e){return Y.isInstance(e,xo)}const So=`DynamicViewStep`;function isDynamicViewStep(e){return Y.isInstance(e,So)}const Co=`ElementProperty`;function isElementProperty(e){return Y.isInstance(e,Co)}const wo=`ExpressionV2`;function isExpressionV2(e){return Y.isInstance(e,wo)}const To=`FqnExpr`;function isFqnExpr(e){return Y.isInstance(e,To)}const Eo=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return Y.isInstance(e,Eo)}const Do=`FqnExprOrWith`;function isFqnExprOrWith(e){return Y.isInstance(e,Do)}const Oo=`FqnReferenceable`,ko=`LikeC4View`;function isLikeC4View(e){return Y.isInstance(e,ko)}const Ao=`MetadataProperty`;function isMetadataProperty(e){return Y.isInstance(e,Ao)}const jo=`MetadataValue`,Mo=`Referenceable`,No=`RelationExpr`;function isRelationExpr(e){return Y.isInstance(e,No)}const Po=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return Y.isInstance(e,Po)}const Fo=`RelationExprOrWith`;function isRelationExprOrWith(e){return Y.isInstance(e,Fo)}const Io=`RelationProperty`,Lo=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return Y.isInstance(e,Lo)}const Ro=`SizeProperty`;function isSizeProperty(e){return Y.isInstance(e,Ro)}const zo=`StringProperty`;function isStringProperty(e){return Y.isInstance(e,zo)}const Bo=`StyleProperty`;function isStyleProperty(e){return Y.isInstance(e,Bo)}const Vo=`ViewProperty`;function isViewProperty(e){return Y.isInstance(e,Vo)}const Ho=`ViewRule`;function isViewRule(e){return Y.isInstance(e,Ho)}const Uo=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return Y.isInstance(e,Uo)}const Wo=`WhereElement`;function isWhereElement(e){return Y.isInstance(e,Wo)}const Go=`WhereElementExpression`;function isWhereElementExpression(e){return Y.isInstance(e,Go)}const Ko=`WhereExpression`,qo=`WhereKindEqual`;function isWhereKindEqual(e){return Y.isInstance(e,qo)}const Jo=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return Y.isInstance(e,Jo)}const Yo=`WhereRelation`;function isWhereRelation(e){return Y.isInstance(e,Yo)}const Xo=`WhereRelationExpression`;function isWhereRelationExpression(e){return Y.isInstance(e,Xo)}const Zo=`WhereTagEqual`;function isWhereTagEqual(e){return Y.isInstance(e,Zo)}const Qo=`AbstractDynamicStep`,$o=`ArrowProperty`;function isArrowProperty(e){return Y.isInstance(e,$o)}const es=`BorderProperty`;function isBorderProperty(e){return Y.isInstance(e,es)}const ts=`ColorProperty`;function isColorProperty(e){return Y.isInstance(e,ts)}const ns=`CustomColor`,rs=`CustomElementProperties`;function isCustomElementProperties(e){return Y.isInstance(e,rs)}const as=`CustomRelationProperties`;function isCustomRelationProperties(e){return Y.isInstance(e,as)}const os=`DeployedInstance`;function isDeployedInstance(e){return Y.isInstance(e,os)}const ss=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return Y.isInstance(e,ss)}const cs=`DeploymentNode`;function isDeploymentNode(e){return Y.isInstance(e,cs)}const ls=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return Y.isInstance(e,ls)}const us=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return Y.isInstance(e,us)}const ds=`DeploymentRelation`;function isDeploymentRelation(e){return Y.isInstance(e,ds)}const fs=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return Y.isInstance(e,fs)}const ps=`DeploymentView`;function isDeploymentView(e){return Y.isInstance(e,ps)}const ms=`DeploymentViewBody`;function isDeploymentViewBody(e){return Y.isInstance(e,ms)}const hs=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return Y.isInstance(e,hs)}const gs=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return Y.isInstance(e,gs)}const _s=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return Y.isInstance(e,_s)}const vs=`DynamicView`;function isDynamicView(e){return Y.isInstance(e,vs)}const ys=`DynamicViewBody`;function isDynamicViewBody(e){return Y.isInstance(e,ys)}const bs=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return Y.isInstance(e,bs)}const xs=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return Y.isInstance(e,xs)}const Ss=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return Y.isInstance(e,Ss)}const Cs=`DynamicViewParallelSteps`;function isDynamicViewParallelSteps(e){return Y.isInstance(e,Cs)}const ws=`DynamicViewRef`,Ts=`Element`;function isElement(e){return Y.isInstance(e,Ts)}const Es=`ElementBody`;function isElementBody(e){return Y.isInstance(e,Es)}const Ds=`ElementKind`;function isElementKind(e){return Y.isInstance(e,Ds)}const Os=`ElementKindExpression`;function isElementKindExpression(e){return Y.isInstance(e,Os)}const ks=`ElementRef`;function isElementRef(e){return Y.isInstance(e,ks)}const As=`ElementStringProperty`;function isElementStringProperty(e){return Y.isInstance(e,As)}const js=`ElementStyleProperty`;function isElementStyleProperty(e){return Y.isInstance(e,js)}const Ms=`ElementTagExpression`;function isElementTagExpression(e){return Y.isInstance(e,Ms)}const Ns=`ElementView`;function isElementView(e){return Y.isInstance(e,Ns)}const Ps=`ElementViewBody`;function isElementViewBody(e){return Y.isInstance(e,Ps)}const Fs=`ElementViewRef`,Is=`Expressions`;function isExpressions(e){return Y.isInstance(e,Is)}const Ls=`ExtendDeployment`;function isExtendDeployment(e){return Y.isInstance(e,Ls)}const Rs=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return Y.isInstance(e,Rs)}const zs=`ExtendElement`;function isExtendElement(e){return Y.isInstance(e,zs)}const Bs=`ExtendElementBody`;function isExtendElementBody(e){return Y.isInstance(e,Bs)}const Vs=`ExtendRelation`;function isExtendRelation(e){return Y.isInstance(e,Vs)}const Hs=`ExtendRelationBody`;function isExtendRelationBody(e){return Y.isInstance(e,Hs)}const Us=`FqnExpressions`;function isFqnExpressions(e){return Y.isInstance(e,Us)}const Ws=`FqnExprWhere`;function isFqnExprWhere(e){return Y.isInstance(e,Ws)}const Gs=`FqnExprWith`;function isFqnExprWith(e){return Y.isInstance(e,Gs)}const Ks=`FqnRef`;function isFqnRef(e){return Y.isInstance(e,Ks)}const qs=`FqnRefExpr`;function isFqnRefExpr(e){return Y.isInstance(e,qs)}const Js=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return Y.isInstance(e,Js)}const Ys=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return Y.isInstance(e,Ys)}const Xs=`Globals`;function isGlobals(e){return Y.isInstance(e,Xs)}const Zs=`GlobalStyle`;function isGlobalStyle(e){return Y.isInstance(e,Zs)}const Qs=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return Y.isInstance(e,Qs)}const $s=`GlobalStyleId`,ec=`HexColor`;function isHexColor(e){return Y.isInstance(e,ec)}const tc=`IconColorProperty`;function isIconColorProperty(e){return Y.isInstance(e,tc)}const nc=`IconPositionProperty`;function isIconPositionProperty(e){return Y.isInstance(e,nc)}const rc=`IconProperty`;function isIconProperty(e){return Y.isInstance(e,rc)}const ic=`IconSizeProperty`;function isIconSizeProperty(e){return Y.isInstance(e,ic)}const ac=`Imported`;function isImported(e){return Y.isInstance(e,ac)}const oc=`ImportsFromPoject`;function isImportsFromPoject(e){return Y.isInstance(e,oc)}const sc=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return Y.isInstance(e,sc)}const cc=`InOutRelationExpr`;function isInOutRelationExpr(e){return Y.isInstance(e,cc)}const lc=`LibIcon`;function isLibIcon(e){return Y.isInstance(e,lc)}const uc=`LikeC4Grammar`;function isLikeC4Grammar(e){return Y.isInstance(e,uc)}const dc=`LikeC4Lib`;function isLikeC4Lib(e){return Y.isInstance(e,dc)}const fc=`LineProperty`;function isLineProperty(e){return Y.isInstance(e,fc)}const pc=`LinkProperty`;function isLinkProperty(e){return Y.isInstance(e,pc)}const mc=`MarkdownOrString`;function isMarkdownOrString(e){return Y.isInstance(e,mc)}const hc=`MetadataArray`;function isMetadataArray(e){return Y.isInstance(e,hc)}const gc=`MetadataAttribute`;function isMetadataAttribute(e){return Y.isInstance(e,gc)}const _c=`MetadataBody`;function isMetadataBody(e){return Y.isInstance(e,_c)}const vc=`Model`;function isModel(e){return Y.isInstance(e,vc)}const yc=`ModelDeployments`;function isModelDeployments(e){return Y.isInstance(e,yc)}const bc=`ModelViews`;function isModelViews(e){return Y.isInstance(e,bc)}const xc=`MultipleProperty`;function isMultipleProperty(e){return Y.isInstance(e,xc)}const Sc=`NavigateToProperty`;function isNavigateToProperty(e){return Y.isInstance(e,Sc)}const Cc=`NotationProperty`;function isNotationProperty(e){return Y.isInstance(e,Cc)}const wc=`NotesProperty`;function isNotesProperty(e){return Y.isInstance(e,wc)}const Tc=`OpacityProperty`;function isOpacityProperty(e){return Y.isInstance(e,Tc)}const Ec=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return Y.isInstance(e,Ec)}const Dc=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return Y.isInstance(e,Dc)}const Oc=`Relation`;function isRelation(e){return Y.isInstance(e,Oc)}const kc=`RelationBody`;function isRelationBody(e){return Y.isInstance(e,kc)}const Ac=`RelationExprWhere`;function isRelationExprWhere(e){return Y.isInstance(e,Ac)}const jc=`RelationExprWith`;function isRelationExprWith(e){return Y.isInstance(e,jc)}const Mc=`RelationKindDotRef`;function isRelationKindDotRef(e){return Y.isInstance(e,Mc)}const Nc=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return Y.isInstance(e,Nc)}const Pc=`RelationshipKind`;function isRelationshipKind(e){return Y.isInstance(e,Pc)}const Fc=`RelationStringProperty`;function isRelationStringProperty(e){return Y.isInstance(e,Fc)}const Ic=`RelationStyleProperty`;function isRelationStyleProperty(e){return Y.isInstance(e,Ic)}const Lc=`RGBAColor`;function isRGBAColor(e){return Y.isInstance(e,Lc)}const Rc=`ShapeProperty`;function isShapeProperty(e){return Y.isInstance(e,Rc)}const zc=`ShapeSizeProperty`;function isShapeSizeProperty(e){return Y.isInstance(e,zc)}const Bc=`SpecificationColor`;function isSpecificationColor(e){return Y.isInstance(e,Bc)}const Vc=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return Y.isInstance(e,Vc)}const Hc=`SpecificationElementKind`;function isSpecificationElementKind(e){return Y.isInstance(e,Hc)}const Uc=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return Y.isInstance(e,Uc)}const Wc=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return Y.isInstance(e,Wc)}const Gc=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return Y.isInstance(e,Gc)}const Kc=`SpecificationRule`;function isSpecificationRule(e){return Y.isInstance(e,Kc)}const qc=`SpecificationTag`;function isSpecificationTag(e){return Y.isInstance(e,qc)}const Jc=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return Y.isInstance(e,Jc)}const Yc=`StrictFqnRef`;function isStrictFqnRef(e){return Y.isInstance(e,Yc)}function isTag(e){return Y.isInstance(e,`Tag`)}const Xc=`TagRef`;function isTagRef(e){return Y.isInstance(e,Xc)}const Zc=`Tags`;function isTags(e){return Y.isInstance(e,Zc)}const Qc=`TextSizeProperty`;function isTextSizeProperty(e){return Y.isInstance(e,Qc)}const $c=`ViewRef`,el=`ViewRuleAncestors`;function isViewRuleAncestors(e){return Y.isInstance(e,el)}const tl=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return Y.isInstance(e,tl)}const nl=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return Y.isInstance(e,nl)}const rl=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return Y.isInstance(e,rl)}const il=`ViewRuleGroup`;function isViewRuleGroup(e){return Y.isInstance(e,il)}const al=`ViewRulePredicate`;function isViewRulePredicate(e){return Y.isInstance(e,al)}const ol=`ViewRuleRank`;function isViewRuleRank(e){return Y.isInstance(e,ol)}const sl=`ViewRuleStyle`;function isViewRuleStyle(e){return Y.isInstance(e,sl)}const cl=`ViewStringProperty`;function isViewStringProperty(e){return Y.isInstance(e,cl)}const ll=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return Y.isInstance(e,ll)}const ul=`WhereElementKind`;function isWhereElementKind(e){return Y.isInstance(e,ul)}const dl=`WhereElementMetadata`;function isWhereElementMetadata(e){return Y.isInstance(e,dl)}const fl=`WhereElementNegation`;function isWhereElementNegation(e){return Y.isInstance(e,fl)}const pl=`WhereElementTag`;function isWhereElementTag(e){return Y.isInstance(e,pl)}const ml=`WhereRelationKind`;function isWhereRelationKind(e){return Y.isInstance(e,ml)}const hl=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return Y.isInstance(e,hl)}const gl=`WhereRelationNegation`;function isWhereRelationNegation(e){return Y.isInstance(e,gl)}const _l=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return Y.isInstance(e,_l)}const vl=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return Y.isInstance(e,vl)}const yl=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return Y.isInstance(e,yl)}const bl=`WhereRelationTag`;function isWhereRelationTag(e){return Y.isInstance(e,bl)}const xl=`WildcardExpression`;function isWildcardExpression(e){return Y.isInstance(e,xl)}const Sl=`DynamicStepChain`;function isDynamicStepChain(e){return Y.isInstance(e,Sl)}const Cl=`DynamicStepSingle`;function isDynamicStepSingle(e){return Y.isInstance(e,Cl)}var LikeC4AstReflection=class extends mn{getAllTypes(){return[Qo,ho,$o,es,go,ts,ns,rs,as,os,ss,_o,cs,ls,us,vo,ds,fs,ps,ms,yo,hs,gs,_s,Sl,Cl,vs,ys,bs,xs,Ss,Cs,bo,ws,xo,So,Ts,Es,Ds,Os,Co,ks,As,js,Ms,Ns,Ps,Fs,wo,Is,Ls,Rs,zs,Bs,`ExtendElementProperty`,Vs,Hs,`ExtendRelationProperty`,To,Eo,Do,Ws,Gs,Us,Ks,qs,Oo,Js,Ys,Zs,Qs,$s,Xs,ec,tc,nc,rc,ic,ac,oc,cc,sc,lc,uc,dc,ko,fc,pc,mc,hc,gc,_c,Ao,jo,vc,yc,`ModelReferenceable`,bc,xc,Sc,Cc,wc,Tc,Ec,Dc,Lc,Mo,Oc,kc,No,Po,Fo,Ac,jc,Mc,Nc,Io,Fc,Ic,Pc,Lo,Rc,zc,Ro,Bc,Vc,Hc,Uc,Wc,Gc,Kc,qc,Jc,Yc,zo,Bo,`Tag`,Xc,Zc,Qc,Vo,$c,Ho,el,tl,nl,rl,il,al,ol,sl,Uo,cl,ll,Wo,Go,ul,dl,fl,pl,Ko,qo,Jo,Yo,Xo,ml,hl,gl,_l,vl,yl,bl,Zo,xl]}computeIsSubtype(e,t){switch(e){case $o:case fc:return this.isSubtype(Lo,t);case es:case tc:case nc:case xc:case Tc:case Rc:return this.isSubtype(Bo,t);case ts:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case os:case cs:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case us:case Ds:return this.isSubtype(vo,t);case ps:case vs:case Ns:return this.isSubtype(ko,t);case hs:case gs:case el:return this.isSubtype(yo,t);case _s:case sc:case cc:case Ec:return this.isSubtype(No,t);case Sl:case Cl:return this.isSubtype(`AbstractDynamicStep`,t)||this.isSubtype(`DynamicViewStep`,t);case bs:return this.isSubtype(bo,t);case xs:case Ss:return this.isSubtype(xo,t);case bo:case Co:case Sc:case Io:case Lo:case zo:case Bo:return this.isSubtype(ho,t);case Ts:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Os:case Ms:case qs:case xl:return this.isSubtype(To,t);case As:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case js:return this.isSubtype(Co,t);case Ls:case zs:case Mo:return this.isSubtype(Oo,t);case To:case Ws:return this.isSubtype(Eo,t);case Eo:case Gs:return this.isSubtype(Do,t);case Do:case Fo:return this.isSubtype(wo,t);case ec:case Lc:return this.isSubtype(go,t);case rc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case ic:case Dc:case zc:case Qc:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case ac:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case pc:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case mc:case hc:return this.isSubtype(jo,t);case gc:case Uc:case Gc:return this.isSubtype(zo,t);case _c:return this.isSubtype(Ao,t);case Ao:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case Cc:case wc:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`StringProperty`,t);case No:case Ac:return this.isSubtype(Po,t);case Po:case jc:return this.isSubtype(Fo,t);case Nc:case Ic:return this.isSubtype(Io,t);case Fc:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case Vo:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case tl:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case nl:case il:case al:case ol:return this.isSubtype(Ho,t);case rl:case sl:return this.isSubtype(Uo,t);case Uo:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case cl:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case ll:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case Wo:case fl:return this.isSubtype(Go,t);case Go:case Xo:return this.isSubtype(Ko,t);case ul:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case dl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case pl:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case Yo:case gl:return this.isSubtype(Xo,t);case ml:case _l:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case hl:case vl:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case yl:case bl: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 Pc;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return ns;case`DeploymentNode:kind`:return us;case`DynamicViewGlobalPredicateRef:predicate`:return Js;case`DynamicViewRef:view`:return vs;case`Element:kind`:case`ElementKindExpression:kind`:return Ds;case`ElementViewRef:view`:return Ns;case`FqnRef:value`:case`StrictFqnRef:value`:return Mo;case`IconProperty:libicon`:return lc;case`Imported:imported`:case`StrictFqnElementRef:el`:return Ts;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return ko;case`ViewRuleGlobalPredicateRef:predicate`:return Ys;case`ViewRuleGlobalStyle:style`:return $s;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return vo;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Qo:return{name:Qo,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case $o:return{name:$o,properties:[{name:`key`},{name:`value`}]};case es:return{name:es,properties:[{name:`key`},{name:`value`}]};case ts:return{name:ts,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case ns:return{name:ns,properties:[{name:`name`}]};case rs:return{name:rs,properties:[{name:`props`,defaultValue:[]}]};case as:return{name:as,properties:[{name:`props`,defaultValue:[]}]};case os:return{name:os,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case ss:return{name:ss,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case cs:return{name:cs,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case ls:return{name:ls,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case us:return{name:us,properties:[{name:`name`}]};case ds:return{name:ds,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case fs:return{name:fs,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ps:return{name:ps,properties:[{name:`body`},{name:`name`}]};case ms:return{name:ms,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case hs:return{name:hs,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case gs:return{name:gs,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case _s:return{name:_s,properties:[{name:`source`},{name:`target`}]};case vs:return{name:vs,properties:[{name:`body`},{name:`name`}]};case ys:return{name:ys,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case bs:return{name:bs,properties:[{name:`key`},{name:`value`}]};case xs:return{name:xs,properties:[{name:`predicate`}]};case Ss:return{name:Ss,properties:[{name:`exprs`}]};case Cs:return{name:Cs,properties:[{name:`steps`,defaultValue:[]}]};case ws:return{name:ws,properties:[{name:`view`}]};case Ts:return{name:Ts,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Es:return{name:Es,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Ds:return{name:Ds,properties:[{name:`name`}]};case Os:return{name:Os,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case ks:return{name:ks,properties:[{name:`modelElement`}]};case As:return{name:As,properties:[{name:`key`},{name:`value`}]};case js:return{name:js,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Ms:return{name:Ms,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Ns:return{name:Ns,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Ps:return{name:Ps,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Fs:return{name:Fs,properties:[{name:`view`}]};case Is:return{name:Is,properties:[{name:`prev`},{name:`value`}]};case Ls:return{name:Ls,properties:[{name:`body`},{name:`deploymentNode`}]};case Rs:return{name:Rs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case zs:return{name:zs,properties:[{name:`body`},{name:`element`}]};case Bs:return{name:Bs,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Vs:return{name:Vs,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Hs:return{name:Hs,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Us:return{name:Us,properties:[{name:`prev`},{name:`value`}]};case Ws:return{name:Ws,properties:[{name:`subject`},{name:`where`}]};case Gs:return{name:Gs,properties:[{name:`custom`},{name:`subject`}]};case Ks:return{name:Ks,properties:[{name:`parent`},{name:`value`}]};case qs:return{name:qs,properties:[{name:`ref`},{name:`selector`}]};case Js:return{name:Js,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ys:return{name:Ys,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Xs:return{name:Xs,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Zs:return{name:Zs,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Qs:return{name:Qs,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case $s:return{name:$s,properties:[{name:`name`}]};case ec:return{name:ec,properties:[{name:`hex`}]};case tc:return{name:tc,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case nc:return{name:nc,properties:[{name:`key`},{name:`value`}]};case rc:return{name:rc,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case ic:return{name:ic,properties:[{name:`key`},{name:`value`}]};case ac:return{name:ac,properties:[{name:`imported`},{name:`prev`}]};case oc:return{name:oc,properties:[{name:`imports`},{name:`project`}]};case sc:return{name:sc,properties:[{name:`to`}]};case cc:return{name:cc,properties:[{name:`inout`}]};case lc:return{name:lc,properties:[{name:`name`}]};case uc:return{name:uc,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case dc:return{name:dc,properties:[{name:`icons`,defaultValue:[]}]};case fc:return{name:fc,properties:[{name:`key`},{name:`value`}]};case pc:return{name:pc,properties:[{name:`key`},{name:`title`},{name:`value`}]};case mc:return{name:mc,properties:[{name:`markdown`},{name:`text`}]};case hc:return{name:hc,properties:[{name:`values`,defaultValue:[]}]};case gc:return{name:gc,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case _c:return{name:_c,properties:[{name:`props`,defaultValue:[]}]};case vc:return{name:vc,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case yc:return{name:yc,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case bc:return{name:bc,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case xc:return{name:xc,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Sc:return{name:Sc,properties:[{name:`key`},{name:`value`}]};case Cc:return{name:Cc,properties:[{name:`key`},{name:`value`}]};case wc:return{name:wc,properties:[{name:`key`},{name:`value`}]};case Tc:return{name:Tc,properties:[{name:`key`},{name:`value`}]};case Ec:return{name:Ec,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Dc:return{name:Dc,properties:[{name:`key`},{name:`value`}]};case Oc:return{name:Oc,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case kc:return{name:kc,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ac:return{name:Ac,properties:[{name:`subject`},{name:`where`}]};case jc:return{name:jc,properties:[{name:`custom`},{name:`subject`}]};case Mc:return{name:Mc,properties:[{name:`kind`}]};case Nc:return{name:Nc,properties:[{name:`key`},{name:`value`}]};case Pc:return{name:Pc,properties:[{name:`name`}]};case Fc:return{name:Fc,properties:[{name:`key`},{name:`value`}]};case Ic:return{name:Ic,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Lc:return{name:Lc,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Rc:return{name:Rc,properties:[{name:`key`},{name:`value`}]};case zc:return{name:zc,properties:[{name:`key`},{name:`value`}]};case Bc:return{name:Bc,properties:[{name:`color`},{name:`name`}]};case Vc:return{name:Vc,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case Hc:return{name:Hc,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case Uc:return{name:Uc,properties:[{name:`key`},{name:`value`}]};case Wc:return{name:Wc,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case Gc:return{name:Gc,properties:[{name:`key`},{name:`value`}]};case Kc:return{name:Kc,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case qc:return{name:qc,properties:[{name:`color`},{name:`tag`}]};case Jc:return{name:Jc,properties:[{name:`el`},{name:`parent`}]};case Yc:return{name:Yc,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Xc:return{name:Xc,properties:[{name:`tag`}]};case Zc:return{name:Zc,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Qc:return{name:Qc,properties:[{name:`key`},{name:`value`}]};case $c:return{name:$c,properties:[{name:`view`}]};case el:return{name:el,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case tl:return{name:tl,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case nl:return{name:nl,properties:[{name:`predicate`}]};case rl:return{name:rl,properties:[{name:`style`}]};case il:return{name:il,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case al:return{name:al,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case ol:return{name:ol,properties:[{name:`targets`},{name:`value`}]};case sl:return{name:sl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case cl:return{name:cl,properties:[{name:`key`},{name:`value`}]};case ll:return{name:ll,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case ul:return{name:ul,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case dl:return{name:dl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case fl:return{name:fl,properties:[{name:`value`}]};case pl:return{name:pl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ml:return{name:ml,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 gl:return{name:gl,properties:[{name:`value`}]};case _l:return{name:_l,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case vl:return{name:vl,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case yl:return{name:yl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case bl:return{name:bl,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case xl:return{name:xl,properties:[{name:`isWildcard`,defaultValue:!1}]};case Sl:return{name:Sl,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Cl:return{name:Cl,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const Y=new LikeC4AstReflection;let wl;const LikeC4Grammar=()=>wl??=$n(`{"$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":"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":[]}`),Tl={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},El={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Dl={AstReflection:()=>new LikeC4AstReflection},Ol={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>Tl,parser:{ParserConfig:()=>El}},kl=Symbol.for(`idattr`),Al={writeId(e,t){return e[kl]=t,e},readId(e){return e[kl]}},jl={writeId(e,t){return b(t)?e[kl]=void 0:e[kl]=t,e},readId(e){return e[kl]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===Tl.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:Ee(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 n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case isColorProperty(r):{let e=toColor(r);_(e)&&(n.color=e);break}case isLineProperty(r):n.line=r.value;break;case isArrowProperty(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:nonexhaustive(r)}break;default:nonexhaustive(r)}return n}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:nonexhaustive(e.direction)}return{direction:r,...n&&{nodeSep:n},...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 ln(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),Ml=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(Ml(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(Ml(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(Ml(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],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function 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(b(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(b(e.parent))return!1;e=e.parent}return!1}var AstNodeDescriptionProvider=class extends Yn{services;constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=cn(e);let r=super.createDescription(e,t,n);return isLikeC4Builtin(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},IndexManager=class extends dn{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,n){let r=this.services.workspace.ProjectsManager;return Kn(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const Nl=compareNaturalHierarchically(`/`),Pl=t((e,t)=>Nl(e.uri.path,t.uri.path),`ensureOrder`);var LangiumDocuments=class extends en{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 n=[...this.documentMap.values(),e].sort(Pl);this.documentMap.clear();for(let e of n)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 Kn(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return Kn(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return Kn(this.documentMap.values()).filter(n=>isLikeC4UserDocument(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return E(this.userDocuments.toArray(),y(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),oe(w(`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 X=J.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`?Mr(e,{acceptRelative:!1,strict:!0})?e:P.file(e).toString():e.toString()}const Fl=compareNaturalHierarchically(`/`,!0),compareUri=(e,t)=>Fl(Dr(e.path),Dr(t.path));function isParentFolderFor(e){return t=>e.startsWith(isString(t)?t:t.folder)}function _overlaps(e,t){let n=isString(e)?e:e.folder,r=isString(t)?t:t.folder;return n===r||n.startsWith(r)||r.startsWith(n)}function overlaps(...e){return Ve(_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?.(Fr(t))??!1}function includes(...e){return Ve(_includes,e)}function excludes(...e){return Ve(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),Nr(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:fe(e,compareProjectByFolder)}const Il={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,mo.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return Il.exclude(Fr(e))}function parseRegisterOptions(e){if(`configUri`in e){invariant(!f(e.configUri),`configUri is emptyish`);let t=P.isUri(e.configUri)?e.configUri:P.parse(normalizeUri(e.configUri)),n=ProjectFolder(F.dirname(t));return{configUri:t,folder:n,folderUri:P.parse(n)}}invariant(!f(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),n=P.parse(t);return{configUri:F.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Ll=class ProjectsManager{services;static DefaultProjectId=Il.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new A.default(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),n=F.joinPath(t,`likec4.config.json`),r=ProjectFolder(t);return{id:e,config:Il.config,folder:r,folderUri:P.parse(r),configUri:n,exclude:Il.exclude,includeConfig:{...Il.includeConfig}}}return nonNullable(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new A.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 A.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){this.services=e,X.trace`created`}isExcludedByWorkspace(e){return this.#n?(P.isUri(e)&&(e=normalizeUri(e)),this.#n(Fr(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=E(e,O(_),y(e=>(!wr(e)&&!e.startsWith(`**`)&&(e=jr(`**`,e)),e)));if(!D(t,1)){this.#n=void 0;return}X.debug`set workspace exclude patterns: ${t}`,this.#n=(0,mo.default)(t,{dot:!0})}catch(e){X.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 D(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){X.debug`reset default project ID`;return}invariant(this.#r.find(t=>t.id===e),`Project "${e}" not found`),X.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(D(this.#r,1)){let e=[...y(this.#r,w(`id`)),Il.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[Il.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&&!!ce(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: [${y(this.#r,w(`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 n=normalizeUri(t);return this.isExcludedByWorkspace(n)?!1:D(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(n)&&!isExcludedByDefault(n):includes(this.#i.get(e),n):!isExcludedByDefault(n)}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: ${Il.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!nn(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=oo.validate(e.config),{configUri:r,folder:i,folderUri:a}=parseRegisterOptions(e),o=oo.normalizeInclude(n.include),s=this.#r.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(X.info`project name changed from ${s.config.name} to ${n.name}`,X.info`remove ${s.id}`,s.id=this.uniqueProjectId(n.name),X.info`add ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#r=ensureProjectsOrder([...this.#r,s]),X.info`add ${s.id}`),safeCall(()=>this.updateIncludesExcludes(s)),this.isInitiatingOrReloading?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>nn(e)?Promise.reject(e):(X.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}relativePath(e){let t=normalizeUri(e),n=this.#o.get(t);return n?F.relative(n.folderUri,P.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(X.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(X.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(nn(e)||X.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){X.warn(`Failed to reloadProjects, no workspace folders found`);return}X.debug`start reload projects`;let n=[];for(let e of t){let t=P.parse(e.uri);X.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)X.debug`found config ${F.relative(t,r.uri)}`,n.push(r.uri)}catch(e){X.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#r.length===0){X.warning(`No config files found`);return}X.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),X.warning(`reset`)}n.sort(compareUri);let r=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){X.warn(loggable(t));let n=r.get(e.toString());n&&(X.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{X.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(y(this.#r,w(`id`))),n=e;if(!t.has(n))return n;X.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){X.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 n=this.#r.find(t=>t.id===e);if(!n)return e===ProjectsManager.DefaultProjectId?X.info`Rebuilding all documents `:X.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let r=X.getChild(n.id),_includes=e=>includes(n,normalizeUri(e)),i=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(i.length===0){r.trace`no documents found for project ${n.id}, skipping rebuild`;return}r.info`rebuild project documents: ${i.length}`,this.resetCaches(),await this.services.workspace.DocumentBuilder.update(i,[],t).catch(e=>{r.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),hn.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 X.warn(`Failed to get workspace URI, using default folder`,{error:e}),P.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){X.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case b(t.exclude):e.exclude=Il.exclude;break;case t.exclude&&D(t.exclude,1):e.exclude=(0,mo.default)(y(t.exclude,t=>(!Or(t)&&!t.startsWith(`**`)&&(t=jr(`**`,t)),Pr(Tr(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!D(n,1))return e;e.includePaths=y(n,t=>{let n=F.resolvePath(e.folderUri,t);return{uri:n,folder:ProjectFolder(n)}}),X.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#r)n.id!==e.id&&(overlaps(t,n)&&X.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{overlaps(t,r)&&X.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=y([e.configUri,t],F.basename);n!==r&&X.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}};function hasLikeC4Ext(e){return Tl.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const Rl=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return Rl.includes(e)}function insideNodeModulesOrRepo(e){for(let t of Rl)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 Cn{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 n of e)try{let e=P.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){logWarnError(e)}let n=this.services.workspace.ProjectsManager,r=0;for(let e of t)try{await n.registerConfigFile(e.uri),r++}catch(e){logWarnError(e)}return t.length!==r&&J.warn`loaded ${r} projects out of ${t.length}`,await super.performStartup(e)}finally{this.#e=!0}}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(uo,P.parse(po)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=Ge(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),i=0,a=[];for(let{projectId:e,includePath:t,includeConfig:i}of n)try{J.debug`scanning include path ${t.fsPath} for project ${e}`;let n=E(await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:i.maxDepth}),O(r));a.push(...n),n.length===0?J.trace`no files found in include path ${t.fsPath}`:J.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){J.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of be(a,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),i++}catch(t){J.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&i>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));i>e?J.warn(`Loaded ${i} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):J.info`loaded ${i} total files from ${n.length} include paths`}}async traverseFolder(e,t,n,r){let i=await this.fileSystemProvider.readDirectory(t,{recursive:!0});for(let t of i)if(this.includeEntry(e,t,n)){if(t.isDirectory){await this.traverseFolder(e,t.uri,n,r);continue}try{r(await this.langiumDocuments.getOrCreateDocument(t.uri))}catch(e){J.warn(`Failed to load document {path}`,{error:e,path:t.uri.fsPath})}}}includeEntry(e,t,n){let r=F.basename(t.uri);return t.isDirectory?!(isNodeModulesOrRepo(r)||this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri)):t.isFile?(n.fileExtensions.includes(F.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcludedByWorkspace(t.uri):!1}workspace(){return this.folders&&D(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();J.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`),P.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),hn.create(()=>{this.#t=this.#t.filter(t=>t!==e)})}async readExcludeConfig(){if(!this.services.lsp.Connection){J.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>Ir(e,{milliseconds:1e3,message:!1});try{J.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),J.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(J.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):J.trace(`no initial exclude configuration found`)}catch(e){J.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=Ln(e)?cn(e):e;return t.likec4ProjectId?t.likec4ProjectId:(J.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Ll.DefaultProjectId)}function stringHash(...e){return stringHash$1(e.length>1?e.join(`:::`):e[0])}function safeCall(e){try{return e()}catch(e){J.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 Cr(performanceNow()-e)}}}var Bl=xr();Xn();const Vl=J.getChild(`manual-layouts`),Hl=`.likec4.snap`,isManualLayoutFile=e=>e!==Hl&&e.endsWith(Hl);function fileName(e){return`${e}${Hl}`}function viewIdFromURI(e){let t=F.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return F.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const Ul={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},Wl=`file://./`;var DefaultLikeC4ManualLayouts=class{services;cache;listeners=[];#e=Ft(1);constructor(e){this.services=e,this.cache=new an,onNextTick(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async handleFileSystemUpdate(e){let t=e.update??e.delete,n=viewIdFromURI(t)??void 0,r=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(r),`delete`in e){this.triggerUpdate(exact({removed:t,projectId:r,viewId:n}));return}let i=this.services.workspace.ProjectsManager.getProject(r);if(!n){let e=await this.readSnapshot(t,i);e?n=e.id:(Vl.error(`Snapshot ${t.fsPath} does not exist or is invalid`),n=`index`)}this.triggerUpdate({updated:t,projectId:r,viewId:n})}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=Vl.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=getManualLayoutsOutDir(e),i=[],a=`${r.toString()}`;try{let o=await n.scanDirectory(r,isManualLayoutFile);if(o.length===0)return null;o.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let r of o)try{let t=await n.readFile(r.uri),o=wa.default.parse(t);a=stringHash$1(a+r.uri.toString()+t);let s=this.resolveIconPathsAfterRead(o,e.folderUri);i.push({...s,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.trace`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let o=Me(i,w(`id`));return{hash:a,views:o}}async readSnapshot(e,t){let n=this.services.workspace.FileSystemProvider;try{let r=await n.readFile(e),i=wa.default.parse(r);if(!t){let n=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(n)}return{...this.resolveIconPathsAfterRead(i,t.folderUri),_layout:`manual`}}catch(t){return Vl.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 Vl.trace`cache hit project ${e.id}`,t;let n=await this.readManualLayouts(e);return this.cache.set(e.id,n),n})}async write(e,t){this.cache.delete(e.id);let n=Vl.getChild(e.id),r=getManualLayoutsOutDir(e),i=F.joinPath(r,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=wa.default.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:zn.create(Sn.create(0,0),Sn.create(a.split(`
|
|
54
54
|
`).length-1,1))};n.debug`write snapshot of ${t.id} in project ${e.id} to ${i.fsPath}`;let s=this.services.workspace.FileSystemProvider;try{await s.writeFile(i,a+`
|
|
55
|
-
`),this.triggerUpdate({updated:i,projectId:e.id,viewId:t.id})}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=
|
|
55
|
+
`),this.triggerUpdate({updated:i,projectId:e.id,viewId:t.id})}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=Vl.getChild(e.id),r=getManualLayoutsOutDir(e),i=F.joinPath(r,fileName(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:zn.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null;this.triggerUpdate({removed:i,projectId:e.id,viewId:t})}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){Vl.trace`clear caches`,this.cache.clear()}triggerUpdate(e){for(let t of this.listeners)safeCall(()=>t(e))}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=P.parse(e.icon),r=F.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${Wl}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(Wl)){let n=e.icon.substring(9),r=F.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const Gl=J.getChild(`chokidar`),Kl={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=ti(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,Gl.debug`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){Gl.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){Gl.debug`create watcher for folder: ${e}`;let t=Sr.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){Gl.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Gl.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=ti(e),r=P.file(e);switch(!0){case isLikeC4Config(n):Gl.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case isManualLayoutFile(n):Gl.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:r});break;case hasLikeC4Ext(n):Gl.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;default:Gl.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=ti(e),r=P.file(e);switch(!0){case isLikeC4Config(n):Gl.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(n):Gl.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case isManualLayoutFile(n):Gl.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:r});break;default:Gl.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Gl.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(uo);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(){J.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){J.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:()=>{}}}};const ql={fileSystemWatcher:()=>new NoopFileSystemWatcher},Jl={fileSystemProvider:()=>new NoopFileSystemProvider,...ql},Yl={manualLayouts:()=>new NoopLikeC4ManualLayouts},Xl=J.getChild(`filesystem`);function isLikeC4ConfigFile(e,t=!1){return!t&&isLikeC4Config(ti(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(ti(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:()=>new SymLinkTraversingFileSystemProvider,...e?Kl:ql});var SymLinkTraversingFileSystemProvider=class extends In{async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(uo);try{return await super.readFile(e)}catch(t){return Xl.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new Bl.fdir().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(isLikeC4File);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:P.file(e)})}catch(t){Xl.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(ensureOrder)}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);if(t.length<=1)return t;let n=compareNaturalHierarchically(`/`,!0),compareByPath=(e,t)=>n(e.uri.path,t.uri.path);return t.sort(compareByPath)}async scanDirectory(e,t){let n=[];try{let r=await new Bl.fdir().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:P.file(e)})}catch(t){Xl.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let n=ni(e.fsPath),r=fi(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Xl.debug(`creating directory {path}`,{path:n}),di(n,{recursive:!0})),Xl.debug(`writing file {path}`,{path:e.fsPath}),await li(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=fi(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await ci(t),Xl.debug(`deleted file {path}`,{path:t}),!0):(Xl.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Xl.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends Qn{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=cn(e);if(t.state<N.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case isDeploymentNode(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=W.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
|
|
56
56
|
`)}case isElement(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
|
|
57
|
-
`):void 0}default:return e}}catch(e){logWarnError(e)}}},El=Bn(),Dl=Nn();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 n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}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 Y={newLine:zn.newLine({allowMore:!0}),oneSpace:zn.oneSpace(),noSpace:zn.noSpace(),indent:zn.indent({allowMore:!0}),noIndent:zn.noIndent()};var LikeC4Formatter=class extends Mn{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let n=sn(e.$cstNode,`values`).filter(_).slice(1);t.cst(n).prepend(Y.oneSpace),t.keywords(`,`).prepend(Y.noSpace).append(Y.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Y.oneSpace),t.keywords(`]->`).prepend(Y.noSpace),t.keywords(`-[`).append(Y.noSpace),t.nodes(...w([e.target,e.tags],_)).prepend(Y.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Y.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Y.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Y.oneSpace),t.keywords(`]->`).prepend(Y.noSpace),t.keywords(`-[`).append(Y.noSpace),t.nodes(...w([e.target,e.tags],_)).prepend(Y.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Y.oneSpace)}),this.on(e,isDynamicViewStep,(e,t)=>{t.keywords(`->`,`<-`).surround(Y.oneSpace),t.property(`dotKind`).prepend(Y.oneSpace).append(Y.oneSpace),t.keywords(`]->`).prepend(Y.noSpace).append(Y.oneSpace),t.keywords(`-[`).prepend(Y.oneSpace).append(Y.noSpace),t.properties(`title`).prepend(Y.oneSpace),(isDynamicStepChain(e)&&isMultiline(e.$cstNode)||isDynamicStepSingle(e)&&isDynamicStepChain(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(zn.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(zn.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(Y.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),n=t.keywords(`{`);n.prepend(Y.noIndent).prepend(Y.oneSpace);let r=isMultiline(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(Y.oneSpace);continue}(!o||!areOverlap(o,e))&&t.cst([e]).prepend(zn.newLine({allowMore:!0})).prepend(Y.indent),o=e}r?i.prepend(Y.noIndent).prepend(zn.newLine({allowMore:!0})):i.prepend(zn.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Y.oneSpace)}formatView(e){this.on(e,isElementView,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Y.oneSpace),t.keywords(`of`,`extends`).surround(Y.oneSpace)}),this.on(e,isDynamicView)?.keywords(`dynamic`,`view`).append(Y.oneSpace),this.on(e,isDeploymentView)?.keywords(`deployment`,`view`).append(Y.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),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(Y.oneSpace):n.prepend(Y.noSpace).append(Y.oneSpace),t.keyword(`;`).prepend(Y.noSpace).append(Y.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Y.oneSpace),t.property(`value`).append(Y.oneSpace),t.keyword(`:`).prepend(Y.noSpace).append(Y.oneSpace),t.keyword(`;`).prepend(Y.noSpace).append(Y.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Y.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Y.oneSpace),t.property(`rankSep`).prepend(Y.oneSpace),t.property(`nodeSep`).prepend(Y.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Y.oneSpace),t.keyword(`:`).prepend(Y.noSpace).append(Y.oneSpace),t.keyword(`;`).prepend(Y.noSpace).append(Y.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let n=Ht(e.$cstNode,`kind`),r=Ht(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Y.oneSpace):(t.cst([r]).append(Y.oneSpace),t.cst([n]).prepend(Y.oneSpace))),t.properties(`props`).prepend(Y.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElement,(e,t)=>{t.keywords(`extend`).append(Y.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Y.oneSpace),t.property(`id`).append(Y.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Y.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Y.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Y.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Y.oneSpace),t.keywords(`{`,`}`,`from`).surround(Y.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Y.noSpace).append(Y.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Y.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Y.oneSpace),t.property(`name`).append(Y.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Y.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode,(e,t)=>{let n=Ht(e.$cstNode,`kind`),r=Ht(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Y.oneSpace):(t.cst([r]).append(Y.oneSpace),t.cst([n]).prepend(Y.oneSpace))),t.properties(`title`).prepend(Y.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(Y.oneSpace),t.keyword(`instanceOf`).append(Y.oneSpace),t.property(`title`).prepend(Y.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Y.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Y.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Y.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Y.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Y.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Y.noSpace).append(Y.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Y.noSpace).append(Y.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Y.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Y.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Y.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Y.oneSpace),t.property(`not`).surround(Y.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Y.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Y.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Y.oneSpace),t.property(`not`).surround(Y.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(Y.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&isMultiline(n?.$cstNode);r&&t.property(`value`).prepend(Y.indent),t.keyword(`,`).prepend(Y.noSpace).append(r?Y.newLine:Y.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Y.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Y.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Y.oneSpace),t.keywords(`-[`).prepend(Y.oneSpace).append(Y.noSpace),t.keywords(`]->`).prepend(Y.noSpace).append(Y.oneSpace),t.property(`dotKind`).prepend(Y.oneSpace).append(Y.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Y.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:nonexhaustive(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;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,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function ancestorsOfNode(e,t){let n=[],r=e.parent;for(;r;){let e=nonNullable(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function linkNodesWithEdges(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);invariant(t,`Source node ${n.source} not found`),invariant(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=ancestorsOfNode(t,e),a=ancestorsOfNode(r,e),o=i.length>0&&a.length>0?Ce(commonHead(me(i),me(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}function ensureParentsFirst(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function updateChildren(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function topologicalSort$1(e){let t=ensureParentsFirst([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let getNode=t=>nonNullable(e.nodes.get(t)),r=new Ft({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=We(D(n,y(e=>{let t=getNode(e.source),n=getNode(e.target),r=e.parent?getNode(e.parent):null;return{id:e.id,edge:e,parent:r,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],addEdgeToGraph=e=>{r.mergeNode(e.source),r.mergeNode(e.target),s.push(e),(0,Pi.default)(r,e.source,e.target)||r.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(addEdgeToGraph(t),o.parent&&o.parent!==t.parent&&D(ancestorsOfNode(o,e.nodes),Le(e=>e.inEdges.includes(t.id)),i(e=>{r.mergeNode(e.id),(0,Pi.default)(r,t.source,e.id)||r.mergeDirectedEdge(t.source,e.id),(0,Pi.default)(r,e.id,t.target)||r.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=getNode(n.parent);r.mergeNode(e.id),(0,Pi.default)(r,e.id,n.id)||r.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,Pi.default)(r,e.id,o.parent)||r.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)addEdgeToGraph(e);invariant(s.length===n.length,`Not all edges were added to the graph`);let c=(0,Ni.topologicalSort)(r),l=[],u=t.slice();for(let e of c){let t=u.findIndex(t=>t.id===e);invariant(t>=0,`Node "${e}" not found`),l.push(...u.splice(t,1))}return u.length>0&&l.length>0&&(l=l.flatMap(e=>{if(u.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>u.includes(e));return n.length>0?(u=u.filter(e=>!n.includes(e)),[...n,e]):e})),l.push(...u),{nodes:updateChildren(ensureParentsFirst(l)),edges:s}}t(topologicalSort$1,`topologicalSort`);function calcViewLayoutHash(e){return e.hash=objectHash({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:D(e.nodes,y(e=>({id:e.id,icon:_(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,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),c(({id:e,...t})=>[e,t])),edges:D(e.edges,y(e=>({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})),c(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var AbstractMemory=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},AbstractStageExclude=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(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(ae(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=D(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 n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=difference(n,e.explicits),e.final=difference(e.final,n),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{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[n,r]=We(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(mergeConnections([...e.connections,...n,...r])),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 n=sortParentsFirst(toArray(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new O.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>isAncestor(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>isAncestor(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new O.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(Ki.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var StageExclude$1=class extends AbstractStageExclude{static{t(this,`StageExclude`)}};function elementExprToPredicate(e){if(U.isCustom(e))return elementExprToPredicate(e.custom.expr);if(U.isWhere(e)){let t=elementExprToPredicate(e.where.expr),n=whereOperatorAsPredicate(e.where.condition);return e=>t(e)&&n(e)}if(U.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(U.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(U.isWildcard(e))return()=>!0;if(U.isModelRef(e)){let t=V.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||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 applyViewRuleStyle(e,t,n){let{shape:r,color:a,icon:o,...s}=e.style,c=!f(s);D(n,w(ne(isGroupElementKind)),w(t),i(t=>{t.shape=r??t.shape,t.color=a??t.color,x(o)&&(t.icon=o),x(e.notation)&&(t.notation=e.notation),c&&(t.style={...t.style,...s})}))}function applyViewRuleStyles(e,t){for(let n of e)!isViewRuleStyle$1(n)||n.targets.length===0||applyViewRuleStyle(n,ye(n.targets.map(elementExprToPredicate)),t);return t}var Ol=class NodesGroup{static kind=vi;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(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 D(this.memory.connections,w(t=>hasIntersection(t.relations,e)),i(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 n of t)e.explicitFirstSeenIn.delete(n);let n=difference(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},ActiveGroupStageExclude=class extends StageExclude{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:kl,findConnectionsBetween:Al}=Zi;var StageInclude$1=class extends AbstractStageInclude{static{t(this,`StageInclude`)}connectWithExisting(e,t=`both`){let n=this._connections.length,hasChanged=()=>this._connections.length>n;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(kl(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Al(e,this.memory.elements,`directed`)),hasChanged()}let r=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Al(e,r,`directed`));if(t===`out`||t===`both`)for(let e of r)this.addConnections(Al(e,this.memory.elements,`directed`));return hasChanged()}addImplicitWithinScope(e){e&&(!this.memory.scope||isAncestor(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return xi.isRelationExpr(this.expression)||D(e,i(({source:e,target:t,boundary:n})=>{D(ze([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),Re(([e,t])=>e===t),de(1),i(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},ActiveGroupStageInclude=class extends StageInclude$1{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},jl=class Memory$1 extends AbstractMemory{static{t(this,`Memory`)}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)}},Ml=class ActiveGroupMemory extends jl{static enter(e,t){let n=`@gr${e.groups.length+1}`;if(e instanceof ActiveGroupMemory){let r=nt.default.from([...e.stack].reverse()),i=e.mutableState();return i.groups.push(new Ol(n,t,e.activeGroupId)),r.push(n),new ActiveGroupMemory(i,e.scope,r)}let r=e.mutableState();r.groups.push(new Ol(n,t,null));let i=nt.default.of(n);return new ActiveGroupMemory(r,e.scope,i)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}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 jl(e,this.scope)}};function updateDepthOfAncestors(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function elementModelToNodeSource(e){let{id:t,title:n,...r}=re(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return exact({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:preferSummary(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...r})}function buildComputedNodes({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&nonNullable(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:vi,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:exact({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(compareByFqnHierarchically).forEach(({id:e,...t})=>{let n=parentFqn(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=parentFqn(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=nonNullable(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,updateDepthOfAncestors(o,r)),o.children.push(e),a=o.level+1);let c=exact({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,nonNullable(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,nonNullable(r.get(e)))}),a}function pickRelationshipProps(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...ue(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function mergePropsFromRelationships(e,t){let n=D(e,Me((e,t)=>(_(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),_(t.description)&&!e.description.some(m(t.description))&&e.description.push(t.description),_(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),_(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),_(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),_(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),_(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),_(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),_(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=b(n.title)??(n.title.length>1?`[...]`:void 0),i=C(n.tags),a=exact({title:r,description:b(n.description),technology:b(n.technology),kind:b(n.kind),head:b(n.head),tail:b(n.tail),color:b(n.color),line:b(n.line),navigateTo:b(n.navigateTo),...isNonEmptyArray(i)&&{tags:i}});if(t){let e=pickRelationshipProps(t);a=Ge({...a,...e},_)}return g(a.title)&&_(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:Nl,findConnectionsBetween:Pl,findConnectionsWithin:Fl}=Xi;function resolveElements$1(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}t(resolveElements$1,`resolveElements`);function resolveModelElements(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function deploymentExpressionToPredicate(e){if(H.isWildcard(e))return()=>!0;if(H.isElementTagExpr(e)||H.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(H.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>parentFqn(e.id)===t:e=>e.id===t}if(H.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?parentFqn(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}nonexhaustive(e)}function instanceSummary(e){return preferSummary(e.$instance)??preferSummary(e.element.$element)}function deploymentNodeToNodeSource(e){let t=e.id,n=e.onlyOneInstance();return exact({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:T(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:preferSummary(e.$node)??void 0,tags:[...e.tags],style:re(e.style,[`icon`,`shape`,`color`])})}function instanceToNodeSource(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.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:T(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function toNodeSource(e){return e.isInstance()?instanceToNodeSource(e):deploymentNodeToNodeSource(e)}function toComputedEdges$1(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];invariant(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=mergePropsFromRelationships(n.map(e=>e.$relationship)),d=exact({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}t(toComputedEdges$1,`toComputedEdges`);function buildNodes$1(e,t){let n=buildComputedNodes(e.$styles,[...t.final].map(toNodeSource));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=instanceSummary(r)??null,t.technology??=r.technology,f(t.tags)&&(t.tags=[...r.tags]),(!t.links||f(t.links))&&T(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}t(buildNodes$1,`buildNodes`);function applyDeploymentViewRuleStyles(e,t){for(let n of e)!isViewRuleStyle$1(n)||n.targets.length===0||applyViewRuleStyle(n,ye(n.targets.map(deploymentExpressionToPredicate)),t);return t}function findCrossBoundarySameSourceOrTarget(e){let t=new O.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new O.default(()=>new Set);for(let[e,r]of t)T(r,2)&&D(r,E(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),oe(S(`group`)),Fe(),w(T(2)),i(He(y(S(`conn`)),sortConnectionsByBoundaryHierarchy(`desc`),Re((e,t,n)=>t===0||e.boundary===n[t-1].boundary),i(t=>{n.get(t).add(e)}))));return n}function findCrossBoundaryConnections(e){e=mergeConnections(e);let t=findCrossBoundarySameSourceOrTarget(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;invariant(r.isDeploymentNode());let a=intersection(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=union(intersection(n.relations.model,e.internalModelRelationships()),intersection(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return D(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 D(e,mergeConnections,Me((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=Ui.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=Nl(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)isNestedConnection(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new Ji(r,i,o)),t},[]))}t(findRedundantConnections$1,`findRedundantConnections`);function cleanRedundantRelationships(e){return differenceConnections(e,findRedundantConnections$1(e))}var StageInclude=class extends AbstractStageInclude{connectWithExisting(e,t=`both`){let n=this._connections.length,hasChanged=()=>this._connections.length>n;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Nl(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Pl(e,this.memory.elements,`directed`)),hasChanged()}let r=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Pl(e,r,`directed`));if(t===`out`||t===`both`)for(let e of r)this.addConnections(Pl(e,this.memory.elements,`directed`));return hasChanged()}processConnections(e){let t=D(e,cleanCrossBoundary,cleanRedundantRelationships);return D(t,i(({source:e,target:t,boundary:n})=>{D(ze([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),Re(([e,t])=>e===t),de(1),i(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},Il=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&&m(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(`
|
|
58
|
-
`)}[qi](e,t,n){return this.toString()}};const Ll={include:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i}))},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i}))}},Rl={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=applyPredicate(Pl(e,[...resolveAscendingSiblings(e)],`directed`),i);r.addConnections(t)}return r}invariant(H.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.incoming);for(let e of a){let t=applyPredicate(Pl(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.incoming)||H.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.incoming))return excludeModelRelations(resolveAllIncomingRelations(t,e.incoming),{stage:r,memory:n},i);if(H.isWildcard(e.incoming))return r;let a=filterIncomingConnections(resolveElements$1(t,e.incoming)),o=D(n.connections,w(a),applyPredicate(i));return r.excludeConnections(o),r}};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 n=resolveModelElements(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const zl={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of resolveAscendingSiblings(e)){let n=applyPredicate(Nl(t,e,`directed`),i);r.addConnections(n)}return r}invariant(H.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.outgoing);for(let e of o){let t=applyPredicate(Pl(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.outgoing)||H.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.outgoing))return excludeModelRelations(resolveAllOutgoingRelations(t,e.outgoing),{stage:r,memory:n},i);if(H.isWildcard(e.outgoing))return r;let a=filterOutgoingConnections(resolveElements$1(t,e.outgoing)),o=D(n.connections,w(a),applyPredicate(i));return r.excludeConnections(o),r}};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 n=resolveModelElements(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const Bl={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(H.isElementTagExpr(e)||H.isElementKindExpr(e)||H.isElementTagExpr(t)||H.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);invariant(!H.isModelRef(e),`Invalid source model ref in direct relation`),invariant(!H.isModelRef(t),`Invalid target model ref in direct relation`);let o=H.isWildcard(e),s=H.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=D(Fl(r.instances()),applyPredicate(a),y(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=resolveElements$1(r,e),i=filterOutgoingConnections(t),postFilter=i;if(n){let e=filterIncomingConnections(t);postFilter=t=>i(t)!==e(t)}l=D(t,E(e=>Pl(e,resolveAscendingSiblings(e),c)),w(postFilter),applyPredicate(a));break}case o&&!s:{let e=resolveElements$1(r,t),i=filterIncomingConnections(e),postFilter=i;if(n){let t=filterOutgoingConnections(e);postFilter=e=>t(e)!==i(e)}l=D(e,E(e=>[...resolveAscendingSiblings(e)].flatMap(t=>Nl(t,e,c))),w(postFilter),applyPredicate(a));break}default:{invariant(!o,`Inference failed - source should be a deployment ref`),invariant(!s,`Inference failed - target should be a deployment ref`);let n=resolveElements$1(r,e),i=resolveElements$1(r,t),u=filterOutgoingConnections(n),d=filterIncomingConnections(i);l=D(n,E(e=>Pl(e,i,c)),w(e=>u(e)&&d(e)),applyPredicate(a))}}return i.addConnections(l),H.isDeploymentRef(e)&&Ke(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),H.isDeploymentRef(t)&&Ke(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=deploymentExpressionToPredicate(e.target),o=deploymentExpressionToPredicate(e.source),s;switch(!0){case H.isWildcard(e.source)&&H.isWildcard(e.target):return r.excludeConnections(applyPredicate(n.connections,i)),r;case H.isModelRef(e.source)&&H.isModelRef(e.target):return s=resolveRelationsBetweenModelElements({source:e.source,target:e.target,expr:e,model:t}),excludeModelRelations(s,{stage:r,memory:n},i);case H.isModelRef(e.source)&&H.isWildcard(e.target):return s=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(s,{stage:r,memory:n},i);case H.isModelRef(e.source):return s=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(s,{stage:r,memory:n},i,e=>a(e.target));case H.isModelRef(e.target):return s=resolveAllIncomingRelations(t,e.target),excludeModelRelations(s,{stage:r,memory:n},i,e=>o(e.source));default:let satisfies=t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source),c=D(n.connections,w(satisfies),applyPredicate(i));return c.length===0||r.excludeConnections(c),r}}};function resolveRelationsBetweenModelElements({source:e,target:t,expr:n,model:r}){let i=resolveModelElements(r,e),a=resolveModelElements(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...findConnectionsBetween$3(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const Vl={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.inout)){for(let e of a){let t=matchConnections(Pl(e,[...resolveAscendingSiblings(e)],`both`),i);r.addConnections(t)}return r}invariant(H.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.inout);for(let e of a){let t=matchConnections(Pl(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.inout)||H.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.inout)){let a=resolveModelElements(t,e.inout);return a.length===0?r:excludeModelRelations(union(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(H.isWildcard(e.inout))return r;let a=resolveElements$1(t,e.inout),o=filterIncomingConnections(a),s=filterOutgoingConnections(a),c=D(n.connections,w(e=>o(e)!==s(e)),applyPredicate(i));return r.excludeConnections(c),r}},Hl={include:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Ul={include:({model:e,stage:t,where:n})=>{let r=[],i;return i=n?D([...e.elements()],applyElementPredicate(n)):toArray(imap(e.roots(),e=>(e.onlyOneInstance()||r.push(...e.children()),e))),t.addExplicit(i),r.length>1?(t.addConnections(Fl([...i,...r])),t.connectWithExisting(r)):t.addConnections(Fl(i)),t.connectWithExisting(i),t},exclude:({stage:e,memory:t,where:n})=>{let r=D([...t.elements],applyElementPredicate(n));return e.exclude(r),e}};function predicateToPatch(e,{expr:t,where:n,...r}){switch(!0){case H.isElementTagExpr(t):case H.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case yi.isCustom(t):case H.isCustom(t):case H.isModelRef(t):return;case H.isWhere(t):return Ll[e]({...r,expr:t,where:n});case yi.isWhere(t):return Hl[e]({...r,expr:t,where:n});case H.isDeploymentRef(t):return Wl[e]({...r,expr:t,where:n});case H.isWildcard(t):return Ul[e]({...r,expr:t,where:n});case yi.isDirect(t):return Bl[e]({...r,expr:t,where:n});case yi.isInOut(t):return Vl[e]({...r,expr:t,where:n});case yi.isOutgoing(t):return zl[e]({...r,expr:t,where:n});case yi.isIncoming(t):return Rl[e]({...r,expr:t,where:n});default:nonexhaustive(t)}}function excludeModelRelations(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=D(n.connections,w(e=>i(e)),w(t=>hasIntersection(t.relations.model,e)),y(t=>t.update({deployment:null,model:intersection(t.relations.model,e)})),applyPredicate(r),w(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function matchConnection(e,t){return applyPredicate(e,t).nonEmpty()}function applyPredicate(...e){if(e.length===1)return t=>applyPredicate(t,e[0]);let[t,n]=e;return n===null?t:d(t)?t.map(e=>applyPredicate(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(toFilterableRelation(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(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,n]=e;return d(t)?n==null?t:t.filter(e=>n(toFilterable(e,e))):n?.(toFilterable(t,t))??!0}function matchConnections(e,t){return t?D(e,w(e=>matchConnection(e,t))):e}function toFilterable(e,t){if(isElementModel(e)){let n=isDeploymentElementModel(t)&&isDeployedInstanceModel(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]],metadata:e.metadata}}if(isNestedElementOfDeployedInstanceModel(e))return ue(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 ue(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 n of e.descendingSiblings())t.add(n);return t}const Wl={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(isDeployedInstanceModel(r))return applyElementPredicate(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:includeDeployedNodeWithExpanded(r,e);break;case t.selector===`children`:includeDeployedNodeChildren(r,e);break;case t.selector===`descendants`:includeDeployedNodeDescendants(r,e);break;default:applyElementPredicate(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=deploymentExpressionToPredicate(e),a=D([...n.elements],w(i),applyElementPredicate(r));return t.exclude(a),t}};function includeDeployedNodeChildren(e,{stage:t,where:n}){let r=applyElementPredicate([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(Fl(r)),t.connectWithExisting(r),t.addExplicit(r))}function includeDeployedNodeWithExpanded(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=applyElementPredicate([...e.children()],r),a=!1;for(let e of i)if(Pl(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(Fl(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function includeDeployedNodeDescendants(e,{stage:t,where:n}){let dfs=e=>{let r=[];for(let t of e.children())t.isDeploymentNode()&&r.push(...dfs(t)),applyElementPredicate(t,n)&&r.push(t);return t.connectWithExisting(r,`in`),t.addConnections(Fl(r)),t.addImplicit(r),r},r=dfs(e);if(r.length===0)return;t.connectWithExisting(r,`out`);let a=findConnectedElements(t);D(r,w(e=>a.has(e)),i(e=>t.addExplicit(e)))}function findConnectedElements(e){return D(e.mergedConnections(),cleanCrossBoundary,cleanRedundantRelationships,Me((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Gl=class StageFinal$1{static{t(this,`StageFinal`)}static for(e){return new StageFinal$1(e)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=D(e.connections,cleanCrossBoundary,cleanRedundantRelationships),n=differenceConnections(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),n=union(e.final,this.memory.explicits),r=new O.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let a=new Set(n),isFinalOrHasIncludedDescendant=e=>{for(let t of a)if(e===t||isAncestor(e,t))return!0;return!1};return D(difference(t,a),ifilter(e=>e.isDeploymentNode()),toArray(),sortByFqnHierarchically,i(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){n.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=treeFromMemoryState(e,`final`),r=e.stageExclude({}),isRemovable=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),i=b([...n.root]);i&&!e.explicits.has(i)&&r.exclude(i);for(let t of e.final){let e=b(n.children(t));e&&!n.hasInOut(e)&&isRemovable(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function processPredicates$1(e,t){let n=Il.empty();for(let r of t)if(isViewRulePredicate$1(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=predicateToPatch(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return Gl.for(n).commit()}t(processPredicates$1,`processPredicates`);function computeDeploymentView(e,{docUri:t,rules:n,...r}){let i=processPredicates$1(e.deployment,n),a=buildNodes$1(e,i),o=toComputedEdges$1(i.connections);linkNodesWithEdges(a,o);let s=topologicalSort$1({nodes:a,edges:o}),c=applyDeploymentViewRuleStyles(n,s.nodes),l=Ie(n,isViewRuleAutoLayout$1),u=buildElementNotations(c);return calcViewLayoutHash({...r,[B]:`computed`,[gi]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:y(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}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 n=e.flatMap(flattenGroupRules(U.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=Ue(t,g),p=exact({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!ie(p),h=!ie(f),_=elementExprToPredicate(e);r.forEach((e,t)=>{isGroupElementKind(e)||!_(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function resolveGlobalRulesInElementView(e,t){return e.reduce((e,n)=>{if(isViewRuleGlobalPredicateRef$1(n)){let r=t.predicates[n.predicateId];return g(r)?e:e.concat(r)}if(isViewRuleGlobalStyle$1(n)){let r=t.styles[n.styleId];return g(r)?e:e.concat(r)}return e.push(n),e},[])}function resolveGlobalRulesInDynamicView(e,t){return e.reduce((e,n)=>{if(isViewRuleGlobalPredicateRef$1(n)){let r=t.dynamicPredicates[n.predicateId];return g(r)?e:e.concat(r)}if(isViewRuleGlobalStyle$1(n)){let r=t.styles[n.styleId];return g(r)?e:e.concat(r)}return e.push(n),e},[])}function elementsFromIncludeProperties(e,t){let n=new Set;for(let r of t)if(isViewRulePredicate$1(r))for(let t of r.include){let r=elementExprToPredicate(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const flattenSteps=e=>{if(isDynamicStepsParallel(e)){let t=[],n=[];for(let r of e.__parallel)if(isDynamicStepsSeries(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return isDynamicStepsSeries(e)?[...e.__series]:e};function elementsFromSteps(e,t){let n=[],addActor=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let r of E(t,flattenSteps)){let t=e.element(r.source),i=e.element(r.target),a=n.indexOf(t),o=n.indexOf(i);a>=0&&o>=0||(r.isBackward?addActor(i,t):addActor(t,i))}return new Set(n)}function findRelations(e,t,n){let r=findConnection$3(e,t,`directed`).flatMap(e=>[...e.relations]).sort(compareRelations);if(!isNonEmptyArray(r))return{};if(r.length===1){let e=r[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 i=D(r,E(e=>e.tags),C()),a=T(i,1)?i:void 0,o=y(r,e=>e.id),s=ke(r).$relationship.navigateTo;s===n&&(s=void 0),s||=D(r,E(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),C(),b());let c=D(r,Me((e,{title:t,technology:n,$relationship:r})=>(_(t)&&e.title.add(t),_(r.color)&&e.color.add(r.color),_(r.line)&&e.line.add(r.line),_(r.kind)&&e.kind.add(r.kind),_(n)&&e.technology.add(n),_(r.description)&&!e.description.some(m(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return exact({tags:a??void 0,relations:o,navigateTo:s,kind:b([...c.kind]),title:b([...c.title]),color:b([...c.color]),line:b([...c.line]),technology:b([...c.technology]),description:b(c.description)})}var DynamicViewCompute=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=resolveGlobalRulesInDynamicView(t,this.model.globals),a=elementsFromIncludeProperties(this.model,i),o=elementsFromSteps(this.model,n),s=D(union(intersection(a,o),o,a),toArray(),sortParentsFirst),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(isAncestor(t,n)){e.push(t);break}}return e},[]),processStep=(e,t,n)=>{if(isDynamicStepsSeries(e)){for(let r of e.__series)t=processStep(r,t,n);return t}let r=n?stepEdgeId(n,t):stepEdgeId(t),{source:i,target:a,title:o,isBackward:l,navigateTo:u,notation:d,...f}=e,p=this.model.element(i),m=s.indexOf(p);invariant(m>=0,`Source ${i} not found`);let h=this.model.element(a),g=s.indexOf(h);invariant(g>=0,`Target ${a} not found`),(c.includes(p)||c.includes(h))&&console.error(`Step ${p.id} -> ${h.id} because it involves a compound`);let{title:v,relations:y,navigateTo:ee,...te}=findRelations(p,h,this.view.id),ne=_(u)&&u!==this.view.id?u:ee,b=e.kind?this.model.specification.relationships[e.kind]:void 0;return this.steps.push(exact({...te,...!e.technology&&!te.technology&&b?.technology&&{technology:b.technology},...!e.color&&!te.color&&b?.color&&{color:b.color},...!e.line&&!te.line&&b?.line&&{line:b.line},...!e.head&&b?.head&&{head:b.head},...!e.tail&&b?.tail&&{tail:b.tail},...f,id:r,source:p,target:h,navigateTo:ne,title:o??v,relations:y??[],isBackward:m>g})),t+1},l=1;for(let e of n){if(isDynamicStepsParallel(e)){let t=1;for(let n of e.__parallel)t=processStep(n,t,l);l++;continue}l=processStep(e,l)}let u=buildComputedNodes(this.model.$styles,s.map(elementModelToNodeSource)),d=this.model.$styles.defaults.relationship,f=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=nonNullable(u.get(t.id),`Source node ${t.id} not found`),l=nonNullable(u.get(n.id),`Target node ${n.id} not found`),f={id:e,parent:commonAncestor(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:d.color,line:d.line,head:d.arrow,tags:o??[],...s};for(a&&(f.dir=`back`);f.parent&&!u.has(f.parent);)f.parent=parentFqn(f.parent);c.outEdges.push(f.id),l.inEdges.push(f.id);for(let e of ancestorsFqn(f.source)){if(e===f.parent)break;u.get(e)?.outEdges.push(f.id)}for(let e of ancestorsFqn(f.target)){if(e===f.parent)break;u.get(e)?.inEdges.push(f.id)}return f}),p=applyCustomElementProperties(i,applyViewRuleStyles(i,s.map(e=>nonNullable(u.get(e.id))))),m=Ie(i,isViewRuleAutoLayout$1),h=buildElementNotations(p);return calcViewLayoutHash({...r,[gi]:`dynamic`,[B]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:m?.direction??`LR`,...m?.nodeSep&&{nodeSep:m.nodeSep},...m?.rankSep&&{rankSep:m.rankSep}},nodes:y(p,e=>(e.icon===`none`&&delete e.icon,e)),edges:f,...h.length>0&&{notation:{nodes:h}}})}};function computeDynamicView(e,t){return new DynamicViewCompute(e,t).compute()}function relationExpressionToPredicates(e){switch(!0){case W.isCustom(e):return relationExpressionToPredicates(e.customRelation.expr);case W.isWhere(e):{let t=relationExpressionToPredicates(e.where.expr),n=whereOperatorAsPredicate(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind,metadata:e.source.metadata},target:{tags:e.target.tags,kind:e.target.kind,metadata:e.target.metadata},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind},...e.metadata&&{metadata:e.metadata}})}case W.isDirect(e):{let t=elementExprToPredicate(e.source),n=elementExprToPredicate(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case W.isInOut(e):{let t=elementExprToPredicate(e.inout);return e=>t(e.source)||t(e.target)}case W.isIncoming(e):{let t=elementExprToPredicate(e.incoming);return e=>t(e.target)}case W.isOutgoing(e):{let t=elementExprToPredicate(e.outgoing);return e=>t(e.source)}default:nonexhaustive(e)}}function applyCustomRelationProperties(e,t,n){let r=e.flatMap(flattenGroupRules(W.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:MarkdownOrString$1(a)}:{},c=o?{notes:MarkdownOrString$1(o)}:{},l=Ue(s,g),u=relationExpressionToPredicates(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...ue(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function findRedundantConnections(e){return D([...e],mergeConnections,Me((e,t,n,r)=>{let i=findDescendantConnections(r,t),a=union(...i.map(S(`relations`))),o=intersection(t.relations,a);if(i.length>0&&(o=union(o,t.directRelations)),findDeepestNestedConnection(r,t.reversed())&&(o=union(o,t.directRelations)),o.size<t.relations.size){let e=r.some(isAnyInOut(t.source)),n=r.some(isAnyInOut(t.target));e&&(o=union(o,toSet(ifilter(t.relations,isOutgoing(t.source))))),n&&(o=union(o,toSet(ifilter(t.relations,isIncoming(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var Kl=class StageFinal{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 n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),n=union(e.final,this.memory.explicits),r=new Set(n),isFinalOrHasIncludedDescendant=e=>{for(let t of r)if(e===t||isAncestor(e,t))return!0;return!1};return D(difference(t,r),toArray(),sortByFqnHierarchically,i(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){n.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=treeFromMemoryState(e,`final`),r=e.stageExclude({}),isRemovable=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),i=b([...n.root]);i&&!e.explicits.has(i)&&r.exclude(i);for(let t of e.final){let e=b(n.children(t));e&&!n.hasInOut(e)&&isRemovable(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:ql,findConnectionsBetween:Jl,findConnectionsWithin:Yl}=Zi;function resolveElements(e,t){switch(!0){case U.isElementKindExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case U.isElementTagExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(V.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(V.flatten(t.ref)),r=t.selector===`children`?toArray(n.children()):toArray(n.descendants());return r&&r.length>0?r:[n]}case U.isModelRef(t):return[e.element(V.flatten(t.ref))];default:nonexhaustive(t)}}function includeDescendantsFromMemory(e,t){if(t.isEmpty()||e.length===0)return e;let n=ye(e.map(e=>isDescendantOf(e))),r=toArray(ifilter(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function resolveAndIncludeFromMemory(e,{memory:t,model:n}){let r=resolveElements(n,e);return U.isModelRef(e)?e.selector===`descendants`?r:includeDescendantsFromMemory(r,t):r}const Xl={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(V.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(Yl(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},Zl={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Yl(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},Ql={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Yl(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},NoWhere=()=>!0,NoFilter=e=>e;function toComputedEdges(e){return e.reduce((e,t)=>{let n=[...t.relations];invariant(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=mergePropsFromRelationships(n.map(e=>e.$relationship),b(w(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=exact({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function buildNodes(e,t){return buildComputedNodes(e.$styles,[...t.final].map(elementModelToNodeSource),t.groups)}const $l=U.isWildcard,isAncestorOrDescendantOf=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),eu={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=$l(e),l=$l(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==NoWhere:{let e=D(i.relationships(),ifilter(o),toArray(),y(e=>new Yi(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==NoWhere:u.push(...Yl(r.elements));break;case c&&l:u.push(...Yl(i.roots()));break;case!c&&l&&o!==NoWhere:{let t=D(resolveElements(i,e),E(e=>D(e,Oe(pe(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(o),iunique(),toArray(),We(t=>t.source===e),([t,n])=>he(D(t,w(t=>!isAncestorOrDescendantOf(e,t.target)),y(t=>new Yi(e,t.target,new Set([t])))),D(n,w(t=>!isAncestorOrDescendantOf(e,t.source)),y(t=>new Yi(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=resolveWildcard(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...Jl(e,a,o));break}case c&&!l&&o!==NoWhere:{let e=D(resolveElements(i,t),E(e=>D(e,Oe(pe(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(o),toArray(),We(t=>t.target===e),([t,n])=>he(D(n,w(t=>!isAncestorOrDescendantOf(e,t.target)),y(t=>new Yi(e,t.target,new Set([t])))),D(t,w(t=>!isAncestorOrDescendantOf(e,t.source)),y(t=>new Yi(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=resolveWildcard(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...Jl(t,e,o));break}default:{invariant(!$l(e),`Inference failed - source must be not a wildcard`),invariant(!$l(t),`Inference failed - target must be not a wildcard`);let a=resolveAndIncludeFromMemory(e,{memory:r,model:i}),o=resolveAndIncludeFromMemory(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...Jl(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=$l(e),c=$l(t),l;switch(!0){case s&&c:l=D(i.connections,E(He(S(`relations`),ifilter(o),toArray())),toSet());break;case!s&&c:l=D(resolveElements(r,e),E(e=>D(e,Oe(pe(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(o),toArray())),toSet());break;case s&&!c:l=D(resolveElements(r,t),E(e=>D(e,Oe(pe(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(o),toArray())),toSet());break;default:{invariant(!$l(e),`Inference failed - source must be not a wildcard`),invariant(!$l(t),`Inference failed - target must be not a wildcard`);let i=resolveElements(r,e),a=resolveElements(r,t),s=new Set;for(let e of i)for(let t of a)isSameHierarchy(e,t)||(s=union(s,intersection(e.allOutgoing,t.allIncoming),n?intersection(t.allOutgoing,e.allIncoming):new Set));l=toSet(ifilter(s,o))}}return a.excludeRelations(l),a}};function resolveWildcard(e,{memory:t,model:n}){let r=resolveElements(n,e);if(!T(r,1))return[[],[]];if(U.isModelRef(e)){let i=toArray(n.element(V.flatten(e.ref)).ascendingSiblings());return[includeDescendantsFromMemory(r,t),includeDescendantsFromMemory(i,t)]}return[r,D(r,y(e=>e.ascendingSiblings()),iflat(),iunique(),toArray(),e=>includeDescendantsFromMemory(e,t))]}const tu={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(U.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...ql(e,t,`directed`))}else{let e=resolveAndIncludeFromMemory(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...C(e.flatMap(e=>[...e.ascendingSiblings()])));let i=incomingConnectionPredicate(n,o);for(let n of t)s.push(...Jl(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function incomingConnectionPredicate(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.target)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return ye([...e.children(n)].map(e=>Ki.isIncoming(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return ye([Ki.isInside(n),...[...e.children(n)].map(e=>Ki.isIncoming(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return ye([Ki.isIncoming(e),Ki.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return Ki.isIncoming(e)}default:nonexhaustive(t)}}const nu={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(U.isWildcard(e)){if(!t)return;o.push(...Jl(t,t.ascendingSiblings()))}else{let t=resolveAndIncludeFromMemory(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=C(t.flatMap(e=>toArray(e.ascendingSiblings()))));for(let e of t)o.push(...Jl(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(toSet(a.filter(i))),r}},ru={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(U.isWildcard(o)){if(!t)return;s.push(...Jl(t,t.ascendingSiblings(),`directed`))}else{let e=resolveAndIncludeFromMemory(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...C(e.flatMap(e=>[...e.ascendingSiblings()])));let i=outgoingConnectionPredicate(n,o);for(let n of e)s.push(...Jl(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(toSet(a.filter(i))),r}};function outgoingConnectionPredicate(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.source)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return ye([...e.children(n)].map(e=>Ki.isOutgoing(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return ye([Ki.isInside(n),...[...e.children(n)].map(e=>Ki.isOutgoing(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return ye([Ki.isOutgoing(e),Ki.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return Ki.isOutgoing(e)}default:nonexhaustive(t)}}const iu={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=i===NoWhere?[...t.roots()]:toArray(ifilter(t.elements(),i));if(e.length===0)return;let[r,a]=We(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(Yl(e)),n.connectWithExisting(e),n}let a=toArray(ifilter(e.children(),i)),o=a.length>0;if(!o){let t=Jl(e,e.siblings()),r=e.parent;t.length===0&&r&&n.addExplicit(r),a.push(e)}n.addExplicit(e);let s=toSet([...r.elements,...e.descendingSiblings()]);for(let e of s)n.addConnections(Jl(e,a,`directed`));o&&(n.addConnections(Yl(a)),n.addExplicit(a));for(let e of a)n.addConnections(Jl(e,s,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===NoWhere?e?(n.exclude([e,...e.descendants()]),n):jl.empty(t.scope).stageExclude(n.expression):(n.exclude(w([...t.elements],r)),n)};function processElementPredicate(e,t,n){switch(!0){case U.isCustom(e):return t===`include`?processElementPredicate(e.custom.expr,t,n):n.stage;case U.isWhere(e):{let r=whereOperatorAsPredicate(e.where.condition),filterWhere=e=>w(e,r);return processElementPredicate(e.where.expr,t,{...n,where:r,filterWhere})}case U.isModelRef(e)&&e.selector===`expanded`:return Xl[t]({...n,expr:e})??n.stage;case U.isWildcard(e):return iu[t]({...n,expr:e})??n.stage;case U.isElementKindExpr(e):case U.isElementTagExpr(e):return Zl[t]({...n,expr:e})??n.stage;case U.isModelRef(e):return Ql[t]({...n,expr:e})??n.stage;default:nonexhaustive(e)}}function processRelationtPredicate(e,t,n){switch(!0){case W.isCustom(e):return t===`include`?processRelationtPredicate(e.customRelation.expr,t,n):n.stage;case W.isWhere(e):{let r=whereOperatorAsPredicate(e.where.condition),filterRelations=e=>new Set(w([...e],r)),filterWhere=e=>D(e,y(e=>new Yi(e.source,e.target,filterRelations(e.relations))),w(e=>e.nonEmpty()));return processRelationtPredicate(e.where.expr,t,{...n,where:r,filterWhere})}case W.isInOut(e):return nu[t]({...n,expr:e})??n.stage;case W.isDirect(e):return eu[t]({...n,expr:e})??n.stage;case W.isOutgoing(e):return ru[t]({...n,expr:e})??n.stage;case W.isIncoming(e):return tu[t]({...n,expr:e})??n.stage;default:nonexhaustive(e)}}function process_predicates(e,t,n){let r={model:e,scope:t.scope,where:NoWhere,filterWhere:NoFilter};for(let i of n){if(isViewRuleGroup$1(i)){t=process_predicates(e,Ml.enter(t,i),i.groupRules),invariant(t instanceof Ml,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(isViewRulePredicate$1(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case xi.isFqnExpr(i):n=processElementPredicate(i,e,{...r,stage:n,memory:t})??n;break;case xi.isRelationExpr(i):n=processRelationtPredicate(i,e,{...r,stage:n,memory:t})??n;break;default:nonexhaustive(i)}t=n.commit()}}}return t}function processPredicates(e,t,n){return t=process_predicates(e,t,n),Kl.for(t).commit()}function computeElementView(e,{docUri:t,rules:n,...r}){let i=resolveGlobalRulesInElementView(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=processPredicates(e,jl.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=assignElementsToGroups(o);let s=buildNodes(e,o),c=toComputedEdges(o.connections);linkNodesWithEdges(s,c);let l=topologicalSort$1({nodes:s,edges:c}),u=applyCustomElementProperties(i,applyViewRuleStyles(i,l.nodes)),d=Ie(i,isViewRuleAutoLayout$1),f=buildElementNotations(u),p=collectRankConstraints(i,u);return calcViewLayoutHash({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:applyCustomRelationProperties(i,u,l.edges),nodes:y(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function collectRankConstraints(e,t){let n=[];for(let r of e){if(!isViewRuleRank$1(r)||r.targets.length===0)continue;let e=D(t,w(ye(r.targets.map(elementExprToPredicate))),y(e=>e.id));T(e,1)&&n.push({type:r.rank,nodes:e})}return n}function assignElementsToGroups(e){if(e.groups.length===0)return e;let t=new O.default(()=>new Set),n=new Map,isAncestorAssigned=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},isDescendantAssigned=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(D(sortParentsFirst([...e.explicitFirstSeenIn.keys()]),i(r=>{if(!isAncestorAssigned(r)){let i=nonNullable(e.explicitFirstSeenIn.get(r));n.set(r,i),t.get(i).add(r)}})),D(sortParentsFirst([...e.lastSeenIn.keys()]),w(e=>!n.has(e)),i(r=>{if(isAncestorAssigned(r)||isDescendantAssigned(r))return;let i=nonNullable(e.lastSeenIn.get(r));n.set(r,i),t.get(i).add(r)})),t.size===0)return e;let r=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:r})}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`}),n=[];for(let r of Fe(e))t.addNode(r.id,{view:r}),isExtendsElementView(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,Pi.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,Ni.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!isExtendsElementView(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!isElementView$1(i))return e;let a=C([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:isNonEmptyArray(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const keysCount=e=>a(e).length,nodeId=e=>stringHash$1(e);function computeProjectsView(e){let t=buildNodesForEachModel(e),key=(e,t)=>`${e}->${t}`,n=new O.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),relationshipsFromTo=(e,t)=>n.get(key(e,t)).relationships,processImportedElement=(e,t)=>{let n=t.projectId;invariant(n!==e.projectId,`Imported element must have a different project id`);let r=relationshipsFromTo(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let i=relationshipsFromTo(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&i.add(n)};for(let t of e)if(!f(t.$data.imports))for(let[e,n]of je(t.$data.imports))for(let r of n){let n=GlobalFqn(e,r.id);processImportedElement(t,nonNullable(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let r=Array.from(n.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];invariant(T(i,1),`Relationships set must have at least one relationship`);let a={id:stringHash$1(e),source:nodeId(t),target:nodeId(n),projectId:t,relations:y(i,S(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:C(E(i,S(`tags`)))},o=b(i);return o&&(a.label=o.title,a.description=preferSummary(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});linkNodesWithEdges(t,r);let i=topologicalSort$1({nodes:t,edges:r});return{id:`projects-view`,[gi]:`projects`,[B]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...i}}function buildNodesForEachModel(e){let t=new Map;for(let n of e){let e=ProjectId(n.projectId),r={id:nodeId(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${keysCount(n.$data.elements)}`,`Relationships: ${keysCount(n.$data.relations)}`,`Views: ${keysCount(n.$data.views)}`].join(`
|
|
59
|
-
`)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}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`}}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
`):void 0}default:return e}}catch(e){logWarnError(e)}}},Zl=_n(),Ql=Wn();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 n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}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 Z={newLine:gn.newLine({allowMore:!0}),oneSpace:gn.oneSpace(),noSpace:gn.noSpace(),indent:gn.indent({allowMore:!0}),noIndent:gn.noIndent()};var LikeC4Formatter=class extends Un{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let n=Yt(e.$cstNode,`values`).filter(_).slice(1);t.cst(n).prepend(Z.oneSpace),t.keywords(`,`).prepend(Z.noSpace).append(Z.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace),t.keywords(`-[`).append(Z.noSpace),t.nodes(...O([e.target,e.tags],_)).prepend(Z.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Z.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace),t.keywords(`-[`).append(Z.noSpace),t.nodes(...O([e.target,e.tags],_)).prepend(Z.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Z.oneSpace)}),this.on(e,isDynamicViewStep,(e,t)=>{t.keywords(`->`,`<-`).surround(Z.oneSpace),t.property(`dotKind`).prepend(Z.oneSpace).append(Z.oneSpace),t.keywords(`]->`).prepend(Z.noSpace).append(Z.oneSpace),t.keywords(`-[`).prepend(Z.oneSpace).append(Z.noSpace),t.properties(`title`).prepend(Z.oneSpace),(isDynamicStepChain(e)&&isMultiline(e.$cstNode)||isDynamicStepSingle(e)&&isDynamicStepChain(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(gn.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(gn.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(Z.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),n=t.keywords(`{`);n.prepend(Z.noIndent).prepend(Z.oneSpace);let r=isMultiline(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(Z.oneSpace);continue}(!o||!areOverlap(o,e))&&t.cst([e]).prepend(gn.newLine({allowMore:!0})).prepend(Z.indent),o=e}r?i.prepend(Z.noIndent).prepend(gn.newLine({allowMore:!0})):i.prepend(gn.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Z.oneSpace)}formatView(e){this.on(e,isElementView,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Z.oneSpace),t.keywords(`of`,`extends`).surround(Z.oneSpace)}),this.on(e,isDynamicView)?.keywords(`dynamic`,`view`).append(Z.oneSpace),this.on(e,isDeploymentView)?.keywords(`deployment`,`view`).append(Z.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),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(Z.oneSpace):n.prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Z.oneSpace),t.property(`value`).append(Z.oneSpace),t.keyword(`:`).prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Z.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Z.oneSpace),t.property(`rankSep`).prepend(Z.oneSpace),t.property(`nodeSep`).prepend(Z.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Z.oneSpace),t.keyword(`:`).prepend(Z.noSpace).append(Z.oneSpace),t.keyword(`;`).prepend(Z.noSpace).append(Z.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let n=Kt(e.$cstNode,`kind`),r=Kt(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Z.oneSpace):(t.cst([r]).append(Z.oneSpace),t.cst([n]).prepend(Z.oneSpace))),t.properties(`props`).prepend(Z.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElement,(e,t)=>{t.keywords(`extend`).append(Z.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Z.oneSpace),t.property(`id`).append(Z.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Z.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Z.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Z.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Z.oneSpace),t.keywords(`{`,`}`,`from`).surround(Z.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Z.noSpace).append(Z.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Z.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Z.oneSpace),t.property(`name`).append(Z.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Z.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode,(e,t)=>{let n=Kt(e.$cstNode,`kind`),r=Kt(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Z.oneSpace):(t.cst([r]).append(Z.oneSpace),t.cst([n]).prepend(Z.oneSpace))),t.properties(`title`).prepend(Z.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(Z.oneSpace),t.keyword(`instanceOf`).append(Z.oneSpace),t.property(`title`).prepend(Z.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Z.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Z.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Z.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Z.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Z.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Z.noSpace).append(Z.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Z.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Z.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Z.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Z.oneSpace),t.property(`not`).surround(Z.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(Z.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&isMultiline(n?.$cstNode);r&&t.property(`value`).prepend(Z.indent),t.keyword(`,`).prepend(Z.noSpace).append(r?Z.newLine:Z.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Z.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Z.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Z.oneSpace),t.keywords(`-[`).prepend(Z.oneSpace).append(Z.noSpace),t.keywords(`]->`).prepend(Z.noSpace).append(Z.oneSpace),t.property(`dotKind`).prepend(Z.oneSpace).append(Z.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Z.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:nonexhaustive(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let n=e.value;isMetadataArray(n)?t=this.getNodeFormatter(n).nodes(...n.values):n&&(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,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function ancestorsOfNode(e,t){let n=[],r=e.parent;for(;r;){let e=nonNullable(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function linkNodesWithEdges(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);invariant(t,`Source node ${n.source} not found`),invariant(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=ancestorsOfNode(t,e),a=ancestorsOfNode(r,e),o=i.length>0&&a.length>0?Ce(commonHead(me(i),me(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}function elementExprToPredicate(e){if(K.isCustom(e))return elementExprToPredicate(e.custom.expr);if(K.isWhere(e)){let t=elementExprToPredicate(e.where.expr),n=whereOperatorAsPredicate(e.where.condition);return e=>t(e)&&n(e)}if(K.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(K.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(K.isWildcard(e))return()=>!0;if(K.isModelRef(e)){let t=W.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 q.isCustom(t):return relationExpressionToPredicates(t.customRelation.expr);case q.isWhere(t):{let e=relationExpressionToPredicates(t.where.expr),n=whereOperatorAsPredicate(t.where.condition);return t=>e(t)&&n({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 q.isDirect(t):{let n=e(t.source),r=e(t.target);return e=>n(e.source)&&r(e.target)||!!t.isBidirectional&&n(e.target)&&r(e.source)}case q.isInOut(t):{let n=e(t.inout);return e=>n(e.source)||n(e.target)}case q.isIncoming(t):{let n=e(t.incoming);return e=>n(e.target)}case q.isOutgoing(t):{let n=e(t.outgoing);return e=>n(e.source)}default:nonexhaustive(t)}}}const $l=createRelationExpressionToPredicates(elementExprToPredicate);function ensureParentsFirst(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function updateChildren(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function topologicalSort$1(e){let t=ensureParentsFirst([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let getNode=t=>nonNullable(e.nodes.get(t)),r=new Pt({multi:!0,allowSelfLoops:!0,type:`directed`}),[i,a]=Ue(E(n,y(e=>{let t=getNode(e.source),n=getNode(e.target),r=e.parent?getNode(e.parent):null;return{id:e.id,edge:e,parent:r,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),o=[],addEdgeToGraph=e=>{r.mergeNode(e.source),r.mergeNode(e.target),o.push(e),(0,ia.default)(r,e.source,e.target)||r.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:a}of i)if(addEdgeToGraph(t),a.parent&&a.parent!==t.parent&&E(ancestorsOfNode(a,e.nodes),Fe(e=>e.inEdges.includes(t.id)),pe(e=>{r.mergeNode(e.id),(0,ia.default)(r,t.source,e.id)||r.mergeDirectedEdge(t.source,e.id),(0,ia.default)(r,e.id,t.target)||r.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=getNode(n.parent);r.mergeNode(e.id),(0,ia.default)(r,e.id,n.id)||r.mergeDirectedEdge(e.id,n.id),a.parent&&a.parent!==n.parent&&((0,ia.default)(r,e.id,a.parent)||r.mergeDirectedEdge(e.id,a.parent))}for(let{edge:e}of a)addEdgeToGraph(e);invariant(o.length===n.length,`Not all edges were added to the graph`);let s=(0,ra.topologicalSort)(r),c=[],l=t.slice();for(let e of s){let t=l.findIndex(t=>t.id===e);invariant(t>=0,`Node "${e}" not found`),c.push(...l.splice(t,1))}return l.length>0&&c.length>0&&(c=c.flatMap(e=>{if(l.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>l.includes(e));return n.length>0?(l=l.filter(e=>!n.includes(e)),[...n,e]):e})),c.push(...l),{nodes:updateChildren(ensureParentsFirst(c)),edges:o}}t(topologicalSort$1,`topologicalSort`);function calcViewLayoutHash(e){return e.hash=objectHash({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:E(e.nodes,y(e=>({id:e.id,icon:_(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})),c(({id:e,...t})=>[e,t])),edges:E(e.edges,y(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})),c(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(d(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=E(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 n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=difference(n,e.explicits),e.final=difference(e.final,n),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[n,r]=Ue(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(mergeConnections([...e.connections,...n,...r])),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 n=sortParentsFirst(toArray(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new A.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>isAncestor(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>isAncestor(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new A.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(ga.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var StageExclude$1=class extends AbstractStageExclude{static{t(this,`StageExclude`)}};function applyViewRuleStyle(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!S(o);E(n,O(Ge(isGroupElementKind)),O(t),pe(t=>{t.shape=r??t.shape,t.color=i??t.color,C(a)&&(t.icon=a),C(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function applyViewRuleStyles(e,t){for(let n of e)!isViewRuleStyle$1(n)||n.targets.length===0||applyViewRuleStyle(n,_e(n.targets.map(elementExprToPredicate)),t);return t}var eu=class NodesGroup{id;viewRule;parent;elements;static kind=zi;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(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 E(this.memory.connections,O(t=>hasIntersection(t.relations,e)),pe(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 n of t)e.explicitFirstSeenIn.delete(n);let n=difference(this.memory.elements,e.elements);for(let t of n)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:tu,findConnectionsBetween:nu}=xa;var StageInclude$1=class extends AbstractStageInclude{static{t(this,`StageInclude`)}connectWithExisting(e,t=`both`){let n=this._connections.length,hasChanged=()=>this._connections.length>n;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(tu(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(nu(e,this.memory.elements,`directed`)),hasChanged()}let r=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(nu(e,r,`directed`));if(t===`out`||t===`both`)for(let e of r)this.addConnections(nu(e,this.memory.elements,`directed`));return hasChanged()}addImplicitWithinScope(e){e&&(!this.memory.scope||isAncestor(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return Hi.isRelationExpr(this.expression)||E(e,pe(({source:e,target:t,boundary:n})=>{E(Le([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),de(([e,t])=>e===t),ue(1),pe(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=difference(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@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 n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},ru=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)}},iu=class ActiveGroupMemory extends ru{state;scope;stack;static enter(e,t){let n=`@gr${e.groups.length+1}`;if(e instanceof ActiveGroupMemory){let r=$e.default.from([...e.stack].reverse()),i=e.mutableState();return i.groups.push(new eu(n,t,e.activeGroupId)),r.push(n),new ActiveGroupMemory(i,e.scope,r)}let r=e.mutableState();r.groups.push(new eu(n,t,null));let i=$e.default.of(n);return new ActiveGroupMemory(r,e.scope,i)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}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 ru(e,this.scope)}};function updateDepthOfAncestors(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function elementModelToNodeSource(e){let{id:t,title:n,...r}=ne(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return exact({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:preferSummary(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...r})}function buildComputedNodes({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&nonNullable(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:zi,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:exact({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(compareByFqnHierarchically).forEach(({id:e,...t})=>{let n=parentFqn(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=parentFqn(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=nonNullable(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,updateDepthOfAncestors(o,r)),o.children.push(e),a=o.level+1);let c=exact({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,nonNullable(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,nonNullable(r.get(e)))}),a}function pickRelationshipProps(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...le(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function mergePropsFromRelationships(e,t){let n=E(e,Ae((e,t)=>(_(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),_(t.description)&&!e.description.some(ae(t.description))&&e.description.push(t.description),_(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),_(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),_(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),_(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),_(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),_(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),_(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=x(n.title)??(n.title.length>1?`[...]`:void 0),i=T(n.tags),a=exact({title:r,description:x(n.description),technology:x(n.technology),kind:x(n.kind),head:x(n.head),tail:x(n.tail),color:x(n.color),line:x(n.line),navigateTo:x(n.navigateTo),...isNonEmptyArray(i)&&{tags:i}});if(t){let e=pickRelationshipProps(t);a=We({...a,...e},_)}return b(a.title)&&_(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:au,findConnectionsBetween:ou,findConnectionsWithin:su}=ba;function resolveElements$1(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}t(resolveElements$1,`resolveElements`);function resolveModelElements(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function deploymentExpressionToPredicate(e){if(G.isWildcard(e))return()=>!0;if(G.isElementTagExpr(e)||G.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(G.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>parentFqn(e.id)===t:e=>e.id===t}if(G.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?parentFqn(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}nonexhaustive(e)}function instanceSummary(e){return preferSummary(e.$instance)??preferSummary(e.element.$element)}function deploymentNodeToNodeSource(e){let t=e.id,n=e.onlyOneInstance();return exact({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:D(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:preferSummary(e.$node)??void 0,tags:[...e.tags],style:ne(e.style,[`icon`,`shape`,`color`])})}function instanceToNodeSource(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.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:D(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function toNodeSource(e){return e.isInstance()?instanceToNodeSource(e):deploymentNodeToNodeSource(e)}const cu=t((e,t,n)=>stringHash$1(`model:${e}:${t}:${n}`),`hashEdgeId`);function mergeBidirectionalEdges(e){let t=new Set;for(let n=0;n<e.length;n++){if(t.has(n))continue;let r=e[n];for(let i=n+1;i<e.length;i++){if(t.has(i))continue;let n=e[i];if(r.source===n.target&&r.target===n.source&&r.label===n.label){r.dir=`both`;let e=r.head??n.head;e&&(r.head||=e,r.tail||=e),n.color&&(r.color||=n.color),n.line&&(r.line||=n.line),t.add(i);break}}}return t.size>0?e.filter((e,n)=>!t.has(n)):e}function toComputedEdges$1(e,t){let n=[],r=[];for(let i of e){let e=[...i.relations.model,...i.relations.deployment];invariant(D(e,1),`Edge must have at least one relation`);let a=i.source.$model.$styles.defaults,o=i.source.id,s=i.target.id;if(t&&e.length>1){let[c,l]=E(e,Ue(e=>t(e,i)));if(c.length>0){for(let e of c){let{title:t,color:r=a.relationship.color,line:c=a.relationship.line,head:l=a.relationship.arrow,...u}=mergePropsFromRelationships([e.$relationship],e.$relationship);n.push({id:cu(o,s,e.id),parent:i.boundary?.id??null,source:o,target:s,label:t??null,relations:[e.id],color:r,line:c,head:l,...u})}if(l.length>0){let e=x(O(l,e=>e.source.id===o&&e.target.id===s)),{title:t,color:n=a.relationship.color,line:c=a.relationship.line,head:u=a.relationship.arrow,...d}=mergePropsFromRelationships(l.map(e=>e.$relationship),e?.$relationship);r.push({id:i.id,parent:i.boundary?.id??null,source:o,target:s,label:t??null,relations:l.map(e=>e.id),color:n,line:c,head:u,...d})}continue}}let{title:c,color:l=a.relationship.color,line:u=a.relationship.line,head:d=a.relationship.arrow,...f}=mergePropsFromRelationships(e.map(e=>e.$relationship)),p=exact({id:i.id,parent:i.boundary?.id??null,source:o,target:s,label:c??null,relations:e.map(e=>e.id),color:l,line:u,head:d,...f});r.push(p)}return[...n,...mergeBidirectionalEdges(r)]}t(toComputedEdges$1,`toComputedEdges`);function buildNodes$1(e,t){let n=buildComputedNodes(e.$styles,[...t.final].map(toNodeSource));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=instanceSummary(r)??null,t.technology??=r.technology,S(t.tags)&&(t.tags=[...r.tags]),(!t.links||S(t.links))&&D(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}t(buildNodes$1,`buildNodes`);function applyDeploymentViewRuleStyles(e,t){for(let n of e)!isViewRuleStyle$1(n)||n.targets.length===0||applyViewRuleStyle(n,_e(n.targets.map(deploymentExpressionToPredicate)),t);return t}function findCrossBoundarySameSourceOrTarget(e){let t=new A.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new A.default(()=>new Set);for(let[e,r]of t)D(r,2)&&E(r,k(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),oe(w(`group`)),Ne(),O(D(2)),pe(Be(y(w(`conn`)),sortConnectionsByBoundaryHierarchy(`desc`),de((e,t,n)=>t===0||e.boundary===n[t-1].boundary),pe(t=>{n.get(t).add(e)}))));return n}function findCrossBoundaryConnections(e){e=mergeConnections(e);let t=findCrossBoundarySameSourceOrTarget(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;invariant(r.isDeploymentNode());let a=intersection(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=union(intersection(n.relations.model,e.internalModelRelationships()),intersection(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return E(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 E(e,mergeConnections,Ae((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=pa.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=au(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)isNestedConnection(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new va(r,i,o)),t},[]))}t(findRedundantConnections$1,`findRedundantConnections`);function cleanRedundantRelationships(e){return differenceConnections(e,findRedundantConnections$1(e))}var StageInclude=class extends AbstractStageInclude{connectWithExisting(e,t=`both`){let n=this._connections.length,hasChanged=()=>this._connections.length>n;if(!isIterable(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(au(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(ou(e,this.memory.elements,`directed`)),hasChanged()}let r=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(ou(e,r,`directed`));if(t===`out`||t===`both`)for(let e of r)this.addConnections(ou(e,this.memory.elements,`directed`));return hasChanged()}processConnections(e){let t=E(e,cleanCrossBoundary,cleanRedundantRelationships);return E(t,pe(({source:e,target:t,boundary:n})=>{E(Le([...toArray(e.ancestors()).reverse(),e],[...toArray(t.ancestors()).reverse(),t]),de(([e,t])=>e===t),ue(1),pe(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},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&&ae(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(`
|
|
58
|
+
`)}[_a](e,t,n){return this.toString()}};const uu={include:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i}))},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return nonNullable(predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i}))}},du={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(G.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=applyPredicate(ou(e,[...resolveAscendingSiblings(e)],`directed`),i);r.addConnections(t)}return r}invariant(G.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.incoming);for(let e of a){let t=applyPredicate(ou(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(G.isElementTagExpr(e.incoming)||G.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(G.isModelRef(e.incoming))return excludeModelRelations(resolveAllIncomingRelations(t,e.incoming),{stage:r,memory:n},i);if(G.isWildcard(e.incoming))return r;let a=filterIncomingConnections(resolveElements$1(t,e.incoming)),o=E(n.connections,O(a),applyPredicate(i));return r.excludeConnections(o),r}};function filterIncomingConnections(e){return _e(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>!satisfies(e.source)&&satisfies(e.target)}))}function resolveAllIncomingRelations(e,t){let n=resolveModelElements(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const fu={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(G.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of resolveAscendingSiblings(e)){let n=applyPredicate(au(t,e,`directed`),i);r.addConnections(n)}return r}invariant(G.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.outgoing);for(let e of o){let t=applyPredicate(ou(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(G.isElementTagExpr(e.outgoing)||G.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(G.isModelRef(e.outgoing))return excludeModelRelations(resolveAllOutgoingRelations(t,e.outgoing),{stage:r,memory:n},i);if(G.isWildcard(e.outgoing))return r;let a=filterOutgoingConnections(resolveElements$1(t,e.outgoing)),o=E(n.connections,O(a),applyPredicate(i));return r.excludeConnections(o),r}};function filterOutgoingConnections(e){return _e(e.map(e=>{let satisfies=t=>t===e||isAncestor(e,t);return e=>satisfies(e.source)&&!satisfies(e.target)}))}function resolveAllOutgoingRelations(e,t){let n=resolveModelElements(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const pu={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(G.isElementTagExpr(e)||G.isElementKindExpr(e)||G.isElementTagExpr(t)||G.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);invariant(!G.isModelRef(e),`Invalid source model ref in direct relation`),invariant(!G.isModelRef(t),`Invalid target model ref in direct relation`);let s=G.isWildcard(e),c=G.isWildcard(t),l=n?`both`:`directed`,u;switch(!0){case s&&c:u=E(su(r.instances()),applyPredicate(a),y(e=>(i.addImplicit(e.boundary),e)));break;case!s&&c:{let t=resolveElements$1(r,e),i=filterOutgoingConnections(t),postFilter=i;if(n){let e=filterIncomingConnections(t);postFilter=t=>i(t)!==e(t)}u=E(t,k(e=>ou(e,resolveAscendingSiblings(e),l)),O(postFilter),applyPredicate(a));break}case s&&!c:{let e=resolveElements$1(r,t),i=filterIncomingConnections(e),postFilter=i;if(n){let t=filterOutgoingConnections(e);postFilter=e=>t(e)!==i(e)}u=E(e,k(e=>[...resolveAscendingSiblings(e)].flatMap(t=>au(t,e,l))),O(postFilter),applyPredicate(a));break}default:{invariant(!s,`Inference failed - source should be a deployment ref`),invariant(!c,`Inference failed - target should be a deployment ref`);let n=resolveElements$1(r,e),i=resolveElements$1(r,t),o=filterOutgoingConnections(n),d=filterIncomingConnections(i);u=E(n,k(e=>ou(e,i,l)),O(e=>o(e)&&d(e)),applyPredicate(a))}}return i.addConnections(u),G.isDeploymentRef(e)&&o(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),G.isDeploymentRef(t)&&o(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=deploymentExpressionToPredicate(e.target),o=deploymentExpressionToPredicate(e.source),s;switch(!0){case G.isWildcard(e.source)&&G.isWildcard(e.target):return r.excludeConnections(applyPredicate(n.connections,i)),r;case G.isModelRef(e.source)&&G.isModelRef(e.target):return s=resolveRelationsBetweenModelElements({source:e.source,target:e.target,expr:e,model:t}),excludeModelRelations(s,{stage:r,memory:n},i);case G.isModelRef(e.source)&&G.isWildcard(e.target):return s=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(s,{stage:r,memory:n},i);case G.isModelRef(e.source):return s=resolveAllOutgoingRelations(t,e.source),excludeModelRelations(s,{stage:r,memory:n},i,e=>a(e.target));case G.isModelRef(e.target):return s=resolveAllIncomingRelations(t,e.target),excludeModelRelations(s,{stage:r,memory:n},i,e=>o(e.source));default:let satisfies=t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source),c=E(n.connections,O(satisfies),applyPredicate(i));return c.length===0||r.excludeConnections(c),r}}};function resolveRelationsBetweenModelElements({source:e,target:t,expr:n,model:r}){let i=resolveModelElements(r,e),a=resolveModelElements(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...findConnectionsBetween$3(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const mu={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(G.isWildcard(e.inout)){for(let e of a){let t=matchConnections(ou(e,[...resolveAscendingSiblings(e)],`both`),i);r.addConnections(t)}return r}invariant(G.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=resolveElements$1(t,e.inout);for(let e of a){let t=matchConnections(ou(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(G.isElementTagExpr(e.inout)||G.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(G.isModelRef(e.inout)){let a=resolveModelElements(t,e.inout);return a.length===0?r:excludeModelRelations(union(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(G.isWildcard(e.inout))return r;let a=resolveElements$1(t,e.inout),o=filterIncomingConnections(a),s=filterOutgoingConnections(a),c=E(n.connections,O(e=>o(e)!==s(e)),applyPredicate(i));return r.excludeConnections(c),r}},hu={include:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=whereOperatorAsPredicate(e.where.condition);return predicateToPatch(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},gu={include:({model:e,stage:t,where:n})=>{let r=[],i;return i=n?E([...e.elements()],applyElementPredicate(n)):toArray(imap(e.roots(),e=>(e.onlyOneInstance()||r.push(...e.children()),e))),t.addExplicit(i),r.length>1?(t.addConnections(su([...i,...r])),t.connectWithExisting(r)):t.addConnections(su(i)),t.connectWithExisting(i),t},exclude:({stage:e,memory:t,where:n})=>{let r=E([...t.elements],applyElementPredicate(n));return e.exclude(r),e}};function predicateToPatch(e,{expr:t,where:n,...r}){switch(!0){case G.isElementTagExpr(t):case G.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case Bi.isCustom(t):case G.isCustom(t):case G.isModelRef(t):return;case G.isWhere(t):return uu[e]({...r,expr:t,where:n});case Bi.isWhere(t):return hu[e]({...r,expr:t,where:n});case G.isDeploymentRef(t):return _u[e]({...r,expr:t,where:n});case G.isWildcard(t):return gu[e]({...r,expr:t,where:n});case Bi.isDirect(t):return pu[e]({...r,expr:t,where:n});case Bi.isInOut(t):return mu[e]({...r,expr:t,where:n});case Bi.isOutgoing(t):return fu[e]({...r,expr:t,where:n});case Bi.isIncoming(t):return du[e]({...r,expr:t,where:n});default:nonexhaustive(t)}}function excludeModelRelations(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=E(n.connections,O(e=>i(e)),O(t=>hasIntersection(t.relations.model,e)),y(t=>t.update({deployment:null,model:intersection(t.relations.model,e)})),applyPredicate(r),O(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function matchConnection(e,t){return applyPredicate(e,t).nonEmpty()}function applyPredicate(...e){if(e.length===1)return t=>applyPredicate(t,e[0]);let[t,n]=e;return n===null?t:h(t)?t.map(e=>applyPredicate(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(toFilterableRelation(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(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,n]=e;return h(t)?n==null?t:t.filter(e=>n(toFilterable(e,e))):n?.(toFilterable(t,t))??!0}function matchConnections(e,t){return t?E(e,O(e=>matchConnection(e,t))):e}function toFilterable(e,t){if(isElementModel(e)){let n=isDeploymentElementModel(t)&&isDeployedInstanceModel(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]],metadata:e.metadata}}if(isNestedElementOfDeployedInstanceModel(e))return le(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 le(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 n of e.descendingSiblings())t.add(n);return t}const _u={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(isDeployedInstanceModel(r))return applyElementPredicate(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:includeDeployedNodeWithExpanded(r,e);break;case t.selector===`children`:includeDeployedNodeChildren(r,e);break;case t.selector===`descendants`:includeDeployedNodeDescendants(r,e);break;default:applyElementPredicate(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=deploymentExpressionToPredicate(e),a=E([...n.elements],O(i),applyElementPredicate(r));return t.exclude(a),t}};function includeDeployedNodeChildren(e,{stage:t,where:n}){let r=applyElementPredicate([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(su(r)),t.connectWithExisting(r),t.addExplicit(r))}function includeDeployedNodeWithExpanded(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=applyElementPredicate([...e.children()],r),a=!1;for(let e of i)if(ou(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(su(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function includeDeployedNodeDescendants(e,{stage:t,where:n}){let dfs=e=>{let r=[];for(let t of e.children())t.isDeploymentNode()&&r.push(...dfs(t)),applyElementPredicate(t,n)&&r.push(t);return t.connectWithExisting(r,`in`),t.addConnections(su(r)),t.addImplicit(r),r},r=dfs(e);if(r.length===0)return;t.connectWithExisting(r,`out`);let i=findConnectedElements(t);E(r,O(e=>i.has(e)),pe(e=>t.addExplicit(e)))}function findConnectedElements(e){return E(e.mergedConnections(),cleanCrossBoundary,cleanRedundantRelationships,Ae((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var vu=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=E(e.connections,cleanCrossBoundary,cleanRedundantRelationships),n=differenceConnections(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),n=union(e.final,this.memory.explicits),r=new A.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),isFinalOrHasIncludedDescendant=e=>{for(let t of i)if(e===t||isAncestor(e,t))return!0;return!1};return E(difference(t,i),ifilter(e=>e.isDeploymentNode()),toArray(),sortByFqnHierarchically,pe(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){n.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=treeFromMemoryState(e,`final`),r=e.stageExclude({}),isRemovable=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),i=x([...n.root]);i&&!e.explicits.has(i)&&r.exclude(i);for(let t of e.final){let e=x(n.children(t));e&&!n.hasInOut(e)&&isRemovable(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}step4AddAncestor(e){let t=new Set;for(let n of e.final)for(let e of n.ancestors())t.add(e);if(t.size>0){let n=union(e.final,t);return e.update({final:n})}return e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e),n=this.step3ProcessBoundaries(t);return this.includeAncestors===!0?this.step4AddAncestor(n):n}};const yu=createRelationExpressionToPredicates(deploymentExpressionToPredicate);function buildExpandPredicate$1(e,t){let n=[],r=[];for(let e of t)if(isViewRulePredicate$1(e)&&`include`in e)for(let t of e.include)Bi.isCustom(t)&&(t.customRelation.multiple===!0?n.push(t):t.customRelation.multiple===!1&&r.push(t));let i=new Set,a=e.specification.relationships;for(let e of Object.keys(a)){let t=a[e];(t?.style??t)?.multiple&&i.add(e)}if(n.length===0&&r.length===0&&i.size===0)return;let o=n.map(e=>({pred:yu(e.customRelation.expr)})),s=r.map(e=>({pred:yu(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??{}},n=resolveEndpoint(t?.source??e.source),r=resolveEndpoint(t?.target??e.target);if(s.length>0){for(let{pred:t}of s)if(t({source:n,target:r,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(i.size>0){let t=e.kind;if(t&&i.has(t))return!0}if(o.length>0){for(let{pred:t}of o)if(t({source:n,target:r,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}t(buildExpandPredicate$1,`buildExpandPredicate`);function processPredicates$1(e,t){let n=lu.empty(),r=!1;for(let i of t){if(isViewRulePredicate$1(i)){let t=`include`in i?`include`:`exclude`,r=i.include??i.exclude;for(let i of r){let r=t===`include`?n.stageInclude(i):n.stageExclude(i);r=predicateToPatch(t,{expr:i,model:e,stage:r,memory:n,where:null})??r,n=r.commit()}}`includeAncestors`in i&&(r=i.includeAncestors)}return vu.for(n,r).commit()}t(processPredicates$1,`processPredicates`);function computeDeploymentView(e,{docUri:t,rules:n,...r}){let i=processPredicates$1(e.deployment,n),a=buildNodes$1(e,i),o=buildExpandPredicate$1(e,n),s=toComputedEdges$1(i.connections,o);linkNodesWithEdges(a,s);let c=topologicalSort$1({nodes:a,edges:s}),l=applyDeploymentViewRuleStyles(n,c.nodes),u=xe(n,isViewRuleAutoLayout$1),d=buildElementNotations(l);return calcViewLayoutHash({...r,[U]:`computed`,[Li]:`deployment`,autoLayout:{direction:u?.direction??`TB`,...u?.nodeSep&&{nodeSep:u.nodeSep},...u?.rankSep&&{rankSep:u.rankSep}},edges:c.edges,nodes:y(l,e=>(e.icon===`none`&&delete e.icon,e)),...d.length>0&&{notation:{nodes:d}}})}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 n=e.flatMap(flattenGroupRules(K.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...p}=He(t,b),m=exact({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),h=!f(m),g=!f(p),_=elementExprToPredicate(e);r.forEach((e,t)=>{isGroupElementKind(e)||!_(e)||(g&&(e={...e,...p,isCustomized:!0}),h&&(e={...e,isCustomized:!0,style:{...e.style,...m}}),r[t]=e)})}return r}function resolveGlobalRulesInElementView(e,t){return e.reduce((e,n)=>{if(isViewRuleGlobalPredicateRef$1(n)){let r=t.predicates[n.predicateId];return b(r)?e:e.concat(r)}if(isViewRuleGlobalStyle$1(n)){let r=t.styles[n.styleId];return b(r)?e:e.concat(r)}return e.push(n),e},[])}function resolveGlobalRulesInDynamicView(e,t){return e.reduce((e,n)=>{if(isViewRuleGlobalPredicateRef$1(n)){let r=t.dynamicPredicates[n.predicateId];return b(r)?e:e.concat(r)}if(isViewRuleGlobalStyle$1(n)){let r=t.styles[n.styleId];return b(r)?e:e.concat(r)}return e.push(n),e},[])}function elementsFromIncludeProperties(e,t){let n=new Set;for(let r of t)if(isViewRulePredicate$1(r))for(let t of r.include){let r=elementExprToPredicate(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const flattenSteps=e=>{if(isDynamicStepsParallel(e)){let t=[],n=[];for(let r of e.__parallel)if(isDynamicStepsSeries(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return isDynamicStepsSeries(e)?[...e.__series]:e};function elementsFromSteps(e,t){let n=[],addActor=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let r of k(t,flattenSteps)){let t=e.element(r.source),i=e.element(r.target),a=n.indexOf(t),o=n.indexOf(i);a>=0&&o>=0||(r.isBackward?addActor(i,t):addActor(t,i))}return new Set(n)}function findRelations(e,t,n){let r=findConnection$3(e,t,`directed`).flatMap(e=>[...e.relations]).sort(compareRelations);if(!isNonEmptyArray(r))return{};if(r.length===1){let e=r[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 i=E(r,k(e=>e.tags),T()),a=D(i,1)?i:void 0,o=y(r,e=>e.id),s=Pe(r).$relationship.navigateTo;s===n&&(s=void 0),s||=E(r,k(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),T(),x());let c=E(r,Ae((e,{title:t,technology:n,$relationship:r})=>(_(t)&&e.title.add(t),_(r.color)&&e.color.add(r.color),_(r.line)&&e.line.add(r.line),_(r.kind)&&e.kind.add(r.kind),_(n)&&e.technology.add(n),_(r.description)&&!e.description.some(ae(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return exact({tags:a??void 0,relations:o,navigateTo:s,kind:x([...c.kind]),title:x([...c.title]),color:x([...c.color]),line:x([...c.line]),technology:x([...c.technology]),description:x(c.description)})}var DynamicViewCompute=class{model;view;steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=resolveGlobalRulesInDynamicView(t,this.model.globals),a=elementsFromIncludeProperties(this.model,i),o=elementsFromSteps(this.model,n),s=E(union(intersection(a,o),o,a),toArray(),sortParentsFirst),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(isAncestor(t,n)){e.push(t);break}}return e},[]),processStep=(e,t,n)=>{if(isDynamicStepsSeries(e)){for(let r of e.__series)t=processStep(r,t,n);return t}let r=n?stepEdgeId(n,t):stepEdgeId(t),{source:i,target:a,title:o,isBackward:l,navigateTo:u,notation:d,...f}=e,p=this.model.element(i),m=s.indexOf(p);invariant(m>=0,`Source ${i} not found`);let h=this.model.element(a),g=s.indexOf(h);invariant(g>=0,`Target ${a} not found`),(c.includes(p)||c.includes(h))&&console.error(`Step ${p.id} -> ${h.id} because it involves a compound`);let{title:v,relations:y,navigateTo:ee,...te}=findRelations(p,h,this.view.id),b=_(u)&&u!==this.view.id?u:ee,x=e.kind?this.model.specification.relationships[e.kind]:void 0;return this.steps.push(exact({...te,...!e.technology&&!te.technology&&x?.technology&&{technology:x.technology},...!e.color&&!te.color&&x?.color&&{color:x.color},...!e.line&&!te.line&&x?.line&&{line:x.line},...!e.head&&x?.head&&{head:x.head},...!e.tail&&x?.tail&&{tail:x.tail},...f,id:r,source:p,target:h,navigateTo:b,title:o??v,relations:y??[],isBackward:m>g})),t+1},l=1;for(let e of n){if(isDynamicStepsParallel(e)){let t=1;for(let n of e.__parallel)t=processStep(n,t,l);l++;continue}l=processStep(e,l)}let u=buildComputedNodes(this.model.$styles,s.map(elementModelToNodeSource)),d=this.model.$styles.defaults.relationship,f=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=nonNullable(u.get(t.id),`Source node ${t.id} not found`),l=nonNullable(u.get(n.id),`Target node ${n.id} not found`),f={id:e,parent:commonAncestor(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:d.color,line:d.line,head:d.arrow,tags:o??[],...s};for(a&&(f.dir=`back`);f.parent&&!u.has(f.parent);)f.parent=parentFqn(f.parent);c.outEdges.push(f.id),l.inEdges.push(f.id);for(let e of ancestorsFqn(f.source)){if(e===f.parent)break;u.get(e)?.outEdges.push(f.id)}for(let e of ancestorsFqn(f.target)){if(e===f.parent)break;u.get(e)?.inEdges.push(f.id)}return f}),p=applyCustomElementProperties(i,applyViewRuleStyles(i,s.map(e=>nonNullable(u.get(e.id))))),m=xe(i,isViewRuleAutoLayout$1),h=buildElementNotations(p);return calcViewLayoutHash({...r,[Li]:`dynamic`,[U]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:m?.direction??`LR`,...m?.nodeSep&&{nodeSep:m.nodeSep},...m?.rankSep&&{rankSep:m.rankSep}},nodes:y(p,e=>(e.icon===`none`&&delete e.icon,e)),edges:f,...h.length>0&&{notation:{nodes:h}}})}};function computeDynamicView(e,t){return new DynamicViewCompute(e,t).compute()}function applyCustomRelationProperties(e,t,n){let r=e.flatMap(flattenGroupRules(q.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,multiple:s,...c}}of r){let r=a?{description:MarkdownOrString$1(a)}:{},s=o?{notes:MarkdownOrString$1(o)}:{},l=He(c,b),u=$l(e);i.forEach((e,a)=>{let o,c;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(c=n),o&&c)break;!o||!c||u({source:o,target:c,...le(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...s,label:n??e.label,isCustomized:!0})})}return i}function findRedundantConnections(e){return E([...e],mergeConnections,Ae((e,t,n,r)=>{let i=findDescendantConnections(r,t),a=union(...i.map(w(`relations`))),o=intersection(t.relations,a);if(i.length>0&&(o=union(o,t.directRelations)),findDeepestNestedConnection(r,t.reversed())&&(o=union(o,t.directRelations)),o.size<t.relations.size){let e=r.some(isAnyInOut(t.source)),n=r.some(isAnyInOut(t.target));e&&(o=union(o,toSet(ifilter(t.relations,isOutgoing(t.source))))),n&&(o=union(o,toSet(ifilter(t.relations,isIncoming(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var bu=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 n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=union(this.memory.elements,e.elements),n=union(e.final,this.memory.explicits),r=new Set(n),isFinalOrHasIncludedDescendant=e=>{for(let t of r)if(e===t||isAncestor(e,t))return!0;return!1};return E(difference(t,r),toArray(),sortByFqnHierarchically,pe(e=>{let t=[...e.children()].filter(isFinalOrHasIncludedDescendant).length;if(t>=2){n.add(e);return}t===1&&isome(e.siblings(),isFinalOrHasIncludedDescendant)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=treeFromMemoryState(e,`final`),r=e.stageExclude({}),isRemovable=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),i=x([...n.root]);i&&!e.explicits.has(i)&&r.exclude(i);for(let t of e.final){let e=x(n.children(t));e&&!n.hasInOut(e)&&isRemovable(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:xu,findConnectionsBetween:Su,findConnectionsWithin:Cu}=xa;function resolveElements(e,t){switch(!0){case K.isElementKindExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case K.isElementTagExpr(t):return[...ifilter(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(W.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(W.flatten(t.ref)),r=t.selector===`children`?toArray(n.children()):toArray(n.descendants());return r&&r.length>0?r:[n]}case K.isModelRef(t):return[e.element(W.flatten(t.ref))];default:nonexhaustive(t)}}function includeDescendantsFromMemory(e,t){if(t.isEmpty()||e.length===0)return e;let n=_e(e.map(e=>isDescendantOf(e))),r=toArray(ifilter(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function resolveAndIncludeFromMemory(e,{memory:t,model:n}){let r=resolveElements(n,e);return K.isModelRef(e)?e.selector===`descendants`?r:includeDescendantsFromMemory(r,t):r}const wu={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(W.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(Cu(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},Tu={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Cu(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},Eu={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Cu(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(resolveElements(t,e));return n.exclude(i),n}},NoWhere=()=>!0,NoFilter=e=>e,hashEdgeId=(e,t,n)=>stringHash$1(`model:${e}:${t}:${n}`);function toComputedEdges(e,t){return e.flatMap(e=>{let n=[...e.relations];invariant(D(n,1),`Edge must have at least one relation`);let r=e.source.$model.$styles.defaults,i=e.source.id,a=e.target.id,o=O(n,e=>e.source.id===i&&e.target.id===a);if(t&&n.length>1){let[o,s]=E(n,Ue(n=>t(n,e)));if(o.length>0){let t=o.map(t=>{let{title:n,color:o=r.relationship.color,line:s=r.relationship.line,head:c=r.relationship.arrow,...l}=mergePropsFromRelationships([t.$relationship],t.$relationship);return{id:hashEdgeId(i,a,t.id),parent:e.boundary?.id??null,source:i,target:a,label:n??null,relations:[t.id],color:o,line:s,head:c,...l}});if(s.length>0){let{title:n,color:o=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=mergePropsFromRelationships(s.map(e=>e.$relationship),x(O(s,e=>e.source.id===i&&e.target.id===a))?.$relationship);t.push({id:e.id,parent:e.boundary?.id??null,source:i,target:a,label:n??null,relations:s.map(e=>e.id),color:o,line:c,head:l,...u})}return t}}let{title:s,color:c=r.relationship.color,line:l=r.relationship.line,head:u=r.relationship.arrow,...d}=mergePropsFromRelationships(n.map(e=>e.$relationship),x(o)?.$relationship);return[exact({id:e.id,parent:e.boundary?.id??null,source:i,target:a,label:s??null,relations:n.map(e=>e.id),color:c,line:l,head:u,...d})]})}function buildNodes(e,t){return buildComputedNodes(e.$styles,[...t.final].map(elementModelToNodeSource),t.groups)}const Du=K.isWildcard,isAncestorOrDescendantOf=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Ou={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=Du(e),l=Du(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==NoWhere:{let e=E(i.relationships(),ifilter(o),toArray(),y(e=>new ya(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==NoWhere:u.push(...Cu(r.elements));break;case c&&l:u.push(...Cu(i.roots()));break;case!c&&l&&o!==NoWhere:{let t=E(resolveElements(i,e),k(e=>E(e,De(he(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(o),iunique(),toArray(),Ue(t=>t.source===e),([t,n])=>je(E(t,O(t=>!isAncestorOrDescendantOf(e,t.target)),y(t=>new ya(e,t.target,new Set([t])))),E(n,O(t=>!isAncestorOrDescendantOf(e,t.source)),y(t=>new ya(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=resolveWildcard(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...Su(e,a,o));break}case c&&!l&&o!==NoWhere:{let e=E(resolveElements(i,t),k(e=>E(e,De(he(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(o),toArray(),Ue(t=>t.target===e),([t,n])=>je(E(n,O(t=>!isAncestorOrDescendantOf(e,t.target)),y(t=>new ya(e,t.target,new Set([t])))),E(t,O(t=>!isAncestorOrDescendantOf(e,t.source)),y(t=>new ya(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=resolveWildcard(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...Su(t,e,o));break}default:{invariant(!Du(e),`Inference failed - source must be not a wildcard`),invariant(!Du(t),`Inference failed - target must be not a wildcard`);let a=resolveAndIncludeFromMemory(e,{memory:r,model:i}),o=resolveAndIncludeFromMemory(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...Su(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=Du(e),c=Du(t),l;switch(!0){case s&&c:l=E(i.connections,k(Be(w(`relations`),ifilter(o),toArray())),toSet());break;case!s&&c:l=E(resolveElements(r,e),k(e=>E(e,De(he(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ifilter(o),toArray())),toSet());break;case s&&!c:l=E(resolveElements(r,t),k(e=>E(e,De(he(n===!0),{onTrue:e=>union(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ifilter(o),toArray())),toSet());break;default:{invariant(!Du(e),`Inference failed - source must be not a wildcard`),invariant(!Du(t),`Inference failed - target must be not a wildcard`);let i=resolveElements(r,e),a=resolveElements(r,t),s=new Set;for(let e of i)for(let t of a)isSameHierarchy(e,t)||(s=union(s,intersection(e.allOutgoing,t.allIncoming),n?intersection(t.allOutgoing,e.allIncoming):new Set));l=toSet(ifilter(s,o))}}return a.excludeRelations(l),a}};function resolveWildcard(e,{memory:t,model:n}){let r=resolveElements(n,e);if(!D(r,1))return[[],[]];if(K.isModelRef(e)){let i=toArray(n.element(W.flatten(e.ref)).ascendingSiblings());return[includeDescendantsFromMemory(r,t),includeDescendantsFromMemory(i,t)]}return[r,E(r,y(e=>e.ascendingSiblings()),iflat(),iunique(),toArray(),e=>includeDescendantsFromMemory(e,t))]}const ku={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(K.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...xu(e,t,`directed`))}else{let e=resolveAndIncludeFromMemory(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...T(e.flatMap(e=>[...e.ascendingSiblings()])));let i=incomingConnectionPredicate(n,o);for(let n of t)s.push(...Su(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(K.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function incomingConnectionPredicate(e,t){switch(!0){case K.isElementKindExpr(t):case K.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.target)}case K.isModelRef(t)&&t.selector===`children`:{let n=W.flatten(t.ref);return _e([...e.children(n)].map(e=>ga.isIncoming(e.id)))}case K.isModelRef(t)&&t.selector===`descendants`:{let n=W.flatten(t.ref);return _e([ga.isInside(n),...[...e.children(n)].map(e=>ga.isIncoming(e.id))])}case K.isModelRef(t)&&t.selector===`expanded`:{let e=W.flatten(t.ref);return _e([ga.isIncoming(e),ga.isInside(e)])}case K.isModelRef(t):{let e=W.flatten(t.ref);return ga.isIncoming(e)}default:nonexhaustive(t)}}const Au={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(K.isWildcard(e)){if(!t)return;o.push(...Su(t,t.ascendingSiblings()))}else{let t=resolveAndIncludeFromMemory(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=T(t.flatMap(e=>toArray(e.ascendingSiblings()))));for(let e of t)o.push(...Su(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(K.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(toSet(a.filter(i))),r}},ju={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(K.isWildcard(o)){if(!t)return;s.push(...Su(t,t.ascendingSiblings(),`directed`))}else{let e=resolveAndIncludeFromMemory(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...T(e.flatMap(e=>[...e.ascendingSiblings()])));let i=outgoingConnectionPredicate(n,o);for(let n of e)s.push(...Su(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(K.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=resolveElements(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(toSet(a.filter(i))),r}};function outgoingConnectionPredicate(e,t){switch(!0){case K.isElementKindExpr(t):case K.isElementTagExpr(t):{let e=elementExprToPredicate(t);return t=>e(t.source)}case K.isModelRef(t)&&t.selector===`children`:{let n=W.flatten(t.ref);return _e([...e.children(n)].map(e=>ga.isOutgoing(e.id)))}case K.isModelRef(t)&&t.selector===`descendants`:{let n=W.flatten(t.ref);return _e([ga.isInside(n),...[...e.children(n)].map(e=>ga.isOutgoing(e.id))])}case K.isModelRef(t)&&t.selector===`expanded`:{let e=W.flatten(t.ref);return _e([ga.isOutgoing(e),ga.isInside(e)])}case K.isModelRef(t):{let e=W.flatten(t.ref);return ga.isOutgoing(e)}default:nonexhaustive(t)}}const Mu={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=i===NoWhere?[...t.roots()]:toArray(ifilter(t.elements(),i));if(e.length===0)return;let[r,a]=Ue(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(Cu(e)),n.connectWithExisting(e),n}let a=toArray(ifilter(e.children(),i)),o=a.length>0;if(!o){let t=Su(e,e.siblings()),r=e.parent;t.length===0&&r&&n.addExplicit(r),a.push(e)}n.addExplicit(e);let s=toSet([...r.elements,...e.descendingSiblings()]);for(let e of s)n.addConnections(Su(e,a,`directed`));o&&(n.addConnections(Cu(a)),n.addExplicit(a));for(let e of a)n.addConnections(Su(e,s,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===NoWhere?e?(n.exclude([e,...e.descendants()]),n):ru.empty(t.scope).stageExclude(n.expression):(n.exclude(O([...t.elements],r)),n)};function processElementPredicate(e,t,n){switch(!0){case K.isCustom(e):return t===`include`?processElementPredicate(e.custom.expr,t,n):n.stage;case K.isWhere(e):{let r=whereOperatorAsPredicate(e.where.condition),filterWhere=e=>O(e,r);return processElementPredicate(e.where.expr,t,{...n,where:r,filterWhere})}case K.isModelRef(e)&&e.selector===`expanded`:return wu[t]({...n,expr:e})??n.stage;case K.isWildcard(e):return Mu[t]({...n,expr:e})??n.stage;case K.isElementKindExpr(e):case K.isElementTagExpr(e):return Tu[t]({...n,expr:e})??n.stage;case K.isModelRef(e):return Eu[t]({...n,expr:e})??n.stage;default:nonexhaustive(e)}}function processRelationtPredicate(e,t,n){switch(!0){case q.isCustom(e):return t===`include`?processRelationtPredicate(e.customRelation.expr,t,n):n.stage;case q.isWhere(e):{let r=whereOperatorAsPredicate(e.where.condition),filterRelations=e=>new Set(O([...e],r)),filterWhere=e=>E(e,y(e=>new ya(e.source,e.target,filterRelations(e.relations))),O(e=>e.nonEmpty()));return processRelationtPredicate(e.where.expr,t,{...n,where:r,filterWhere})}case q.isInOut(e):return Au[t]({...n,expr:e})??n.stage;case q.isDirect(e):return Ou[t]({...n,expr:e})??n.stage;case q.isOutgoing(e):return ju[t]({...n,expr:e})??n.stage;case q.isIncoming(e):return ku[t]({...n,expr:e})??n.stage;default:nonexhaustive(e)}}function process_predicates(e,t,n){let r={model:e,scope:t.scope,where:NoWhere,filterWhere:NoFilter};for(let i of n){if(isViewRuleGroup$1(i)){t=process_predicates(e,iu.enter(t,i),i.groupRules),invariant(t instanceof iu,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(isViewRulePredicate$1(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case Hi.isFqnExpr(i):n=processElementPredicate(i,e,{...r,stage:n,memory:t})??n;break;case Hi.isRelationExpr(i):n=processRelationtPredicate(i,e,{...r,stage:n,memory:t})??n;break;default:nonexhaustive(i)}t=n.commit()}}}return t}function processPredicates(e,t,n){return t=process_predicates(e,t,n),bu.for(t).commit()}function buildExpandPredicate(e,t){let n=t.flatMap(flattenGroupRules(q.isCustom)).filter(e=>e.customRelation.multiple===!0),r=t.flatMap(flattenGroupRules(q.isCustom)).filter(e=>e.customRelation.multiple===!1),i=new Set,a=e.specification.relationships;for(let e of Object.keys(a)){let t=a[e];(t?.style??t)?.multiple&&i.add(e)}if(n.length===0&&r.length===0&&i.size===0)return;let o=n.map(e=>({pred:$l(e.customRelation.expr)})),s=r.map(e=>({pred:$l(e.customRelation.expr)}));return(e,t)=>{let n=t?.source??e.source,r=t?.target??e.target;if(s.length>0){for(let{pred:t}of s)if(t({source:n,target:r,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!1}if(i.size>0){let t=e.kind;if(t&&i.has(t))return!0}if(o.length>0){for(let{pred:t}of o)if(t({source:n,target:r,kind:e.kind,tags:e.tags,metadata:e.metadata}))return!0}return!1}}function computeElementView(e,{docUri:t,rules:n,...r}){let i=resolveGlobalRulesInElementView(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=processPredicates(e,ru.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=assignElementsToGroups(o);let s=buildNodes(e,o),c=buildExpandPredicate(e,i),l=toComputedEdges(o.connections,c);linkNodesWithEdges(s,l);let u=topologicalSort$1({nodes:s,edges:l}),d=applyCustomElementProperties(i,applyViewRuleStyles(i,u.nodes)),f=xe(i,isViewRuleAutoLayout$1),p=buildElementNotations(d),m=collectRankConstraints(i,d);return calcViewLayoutHash({...r,_stage:`computed`,autoLayout:{direction:f?.direction??`TB`,...f?.nodeSep&&{nodeSep:f.nodeSep},...f?.rankSep&&{rankSep:f.rankSep}},edges:applyCustomRelationProperties(i,d,u.edges),nodes:y(d,e=>(e.icon===`none`&&delete e.icon,e)),...p.length>0&&{notation:{nodes:p}},...m.length>0&&{ranks:m}})}function collectRankConstraints(e,t){let n=[];for(let r of e){if(!isViewRuleRank$1(r)||r.targets.length===0)continue;let e=E(t,O(_e(r.targets.map(elementExprToPredicate))),y(e=>e.id));D(e,1)&&n.push({type:r.rank,nodes:e})}return n}function assignElementsToGroups(e){if(e.groups.length===0)return e;let t=new A.default(()=>new Set),n=new Map,isAncestorAssigned=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},isDescendantAssigned=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(E(sortParentsFirst([...e.explicitFirstSeenIn.keys()]),pe(r=>{if(!isAncestorAssigned(r)){let i=nonNullable(e.explicitFirstSeenIn.get(r));n.set(r,i),t.get(i).add(r)}})),E(sortParentsFirst([...e.lastSeenIn.keys()]),O(e=>!n.has(e)),pe(r=>{if(isAncestorAssigned(r)||isDescendantAssigned(r))return;let i=nonNullable(e.lastSeenIn.get(r));n.set(r,i),t.get(i).add(r)})),t.size===0)return e;let r=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:r})}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 Pt({type:`directed`}),n=[];for(let r of Ne(e))t.addNode(r.id,{view:r}),isExtendsElementView(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,ia.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,ra.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!isExtendsElementView(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!isElementView$1(i))return e;let a=T([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:isNonEmptyArray(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const keysCount=e=>a(e).length,Nu=t(e=>stringHash$1(e),`nodeId`);function computeProjectsView(e){let t=buildNodesForEachModel(e),key=(e,t)=>`${e}->${t}`,n=new A.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),relationshipsFromTo=(e,t)=>n.get(key(e,t)).relationships,processImportedElement=(e,t)=>{let n=t.projectId;invariant(n!==e.projectId,`Imported element must have a different project id`);let r=relationshipsFromTo(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let i=relationshipsFromTo(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&i.add(n)};for(let t of e)if(!S(t.$data.imports))for(let[e,n]of Ie(t.$data.imports))for(let r of n){let n=GlobalFqn(e,r.id);processImportedElement(t,nonNullable(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let r=Array.from(n.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];invariant(D(i,1),`Relationships set must have at least one relationship`);let a={id:stringHash$1(e),source:Nu(t),target:Nu(n),projectId:t,relations:y(i,w(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:T(k(i,w(`tags`)))},o=x(i);return o&&(a.label=o.title,a.description=preferSummary(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});linkNodesWithEdges(t,r);let i=topologicalSort$1({nodes:t,edges:r});return{id:`projects-view`,[Li]:`projects`,[U]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...i}}function buildNodesForEachModel(e){let t=new Map;for(let n of e){let e=ProjectId(n.projectId),r={id:Nu(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${keysCount(n.$data.elements)}`,`Relationships: ${keysCount(n.$data.relations)}`,`Views: ${keysCount(n.$data.views)}`].join(`
|
|
59
|
+
`)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}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`}}Xn();const Pu=J.getChild(`LanguageServices`),Fu=t(e=>e.severity===Jn.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=E(this.services.shared.workspace.LangiumDocuments.groupedByProject(),Ie(),y(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:y(n,w(`uri`)),config:a}}));if(D(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(D(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=y(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),w(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return ha.create({...r.$data,_stage:`layouted`,views:E(i,y(w(`diagram`)),Me(w(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===ha.EMPTY){Pu.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!D(n,1))throw Error(`No models found`);let r=computeProjectsView(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return E(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),k(e=>E(e.diagnostics??[],O(Fu),y(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:nonexhaustive(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,n=this.services.lsp.Formatter,r=buildFormattingOptions(e),i=this.collectDocumentsToFormat(t,e);i.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let a=new Map;for(let e of i){let t=e.uri.toString(),i=await n.formatDocument(e,{options:r,textDocument:{uri:t}}),o=i.length===0?e.textDocument.getText():qt.applyEdits(e.textDocument,i);a.set(t,o)}return a}collectDocumentsToFormat(e,t){let n=t?.projectIds??[],r=t?.documentUris??[],i=new Map;if(n.length>0)for(let t of n)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);else if(r.length===0)for(let t of this.projectsManager.all)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);for(let t of r){if(i.has(t))continue;let n;try{n=e.getDocument(P.parse(t))}catch{Pu.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(n)){Pu.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Pu.debug(`disposing LikeC4LanguageServices`),this.services.likec4.ModelBuilder.dispose(),this.services.Rpc.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Pu.error(loggable(e))}finally{Pu.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,n){if(isLikeC4LangiumDocument(e))return e.state<N.Linked&&(J.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(N.Linked,e.uri,n),J.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Al.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=projectIdFrom(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};Xn();function isCompletionForPojectName(e,t){return On(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const Iu=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
|
|
60
|
+
title 'Untitled'
|
|
61
|
+
|
|
62
|
+
include \${0:*}
|
|
63
|
+
}`;var LikeC4CompletionProvider=class extends on{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Hn(t.feature):return this.completionForKeyword(e,t.feature,n);case Fn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(!this.filterKeyword(e,t))return;let acceptProperty=r=>{n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:I.Property,insertTextFormat:yn.Snippet,insertText:`${t.value} ${r}`})},acceptSnippet=({insertText:r,...i})=>{n(e,{label:t.value,detail:`Insert ${t.value}`,kind:I.Snippet,insertTextFormat:yn.Snippet,...i,insertText:`${t.value} ${r}`})},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`&&un(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:I.Class,insertText:`view ${Iu}`});break;case t.value===`dynamic`&&un(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:I.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
|
|
64
|
+
`)});break;case t.value===`view`&&un(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:I.Class,insertText:Iu});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(ji);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(Mi);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(Oi);break;case t.value===`border`:acceptPropertyAndSuggest(Ai);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(`{
|
|
65
|
+
$0
|
|
66
|
+
}`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:I.Module,insertText:`{
|
|
67
|
+
$0
|
|
68
|
+
}`});break;case t.value===`group`:acceptSnippet({kind:I.Module,insertText:`'\${1:Title}' {
|
|
69
|
+
$0
|
|
70
|
+
}`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:I.Module,insertText:`{
|
|
71
|
+
$0
|
|
72
|
+
}`});break;case t.value===`style`&&e.node&&un(e.node,isGlobalStyle):acceptSnippet({kind:I.Module,insertText:`\${1:name} \${2:*} {
|
|
73
|
+
$0
|
|
74
|
+
}`});break;case t.value===`style`&&e.node&&un(e.node,_e([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:I.Module,insertText:`\${1:*} {
|
|
75
|
+
$0
|
|
76
|
+
}`});break;case t.value===`style`:acceptSnippet({kind:I.Module,insertText:`{
|
|
77
|
+
$0
|
|
78
|
+
}`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:I.Class,insertText:`$1 {
|
|
64
79
|
$0
|
|
65
|
-
}`});break;case t.value===`
|
|
80
|
+
}`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:I.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:yn.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=S(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:I.Folder,insertText:n,filterText:n,textEdit:fn.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},LikeC4DocumentHighlightProvider=class extends Mn{createDocumentHighlight(e){return Ql.DocumentHighlight.create(e.segment.range,Ql.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:tn(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let n=Kt(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Mr(r))return{range:n,target:r}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Mr(t)||Ar(t))return t;if(Or(t))return Tr(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Tr(n.toString(),t)}relativeLink(e,t){if(Ar(t))return kr(t);if(Or(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return kr(Er(new URL(t,r).toString(),n))}return null}};Xn();const Lu=J.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,n){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<N.Linked&&(Lu.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(N.Linked,e.uri,n),Lu.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(_);return n.length===0?[]:[{kind:wn.Namespace,name:`icons`,range:t.range,selectionRange:sn(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=Kt(t,`name`);if(!n)return[];let r=E([...e.elements,...e.tags,...e.relationships],y(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)}),O(_));return r.length===0?[]:[{kind:wn.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=Kt(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=Kt(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,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,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,n=Kt(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=Kt(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||S(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||S(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||S(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?Kt(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.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,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=cn(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Ru=`
|
|
66
81
|
---
|
|
67
|
-
`;var LikeC4HoverProvider=class extends
|
|
82
|
+
`;var LikeC4HoverProvider=class extends Rn{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){J.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=preferSummary(n);i&&r.push(``,(i.md??i.txt).split(`
|
|
68
83
|
`).join(`
|
|
69
84
|
`));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
|
|
70
85
|
<small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
|
|
71
|
-
`)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(
|
|
72
|
-
`):void 0}getDeploymentNodeHover(e){let t=
|
|
73
|
-
`)}}}getDeployedInstanceHover(e){let t=
|
|
74
|
-
`)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};Ln();const uu=K.getChild(`SemanticTokenProvider`),du={...Kn},fu={...kn};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in fu)return t.push(fu[i]),n;if(i in du)return()=>e(du[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const pu=`Stop Highlighting`,stopHighlight=()=>{throw pu};var LikeC4SemanticTokenProvider=class extends Vn{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};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=>{_(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=>{_(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(isAnyOf(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{_(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=>{_(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=>{_(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=>{_(e.node.value)&&e.property(`value`).string()}),when(isAnyOf(isColorProperty,isIconColorProperty),e=>{_(e.node.customColor)&&e.property(`customColor`).enum(),_(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!isAnyOf(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&_(e.key),e=>e.property(`key`).property()),when(isAnyOf(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{_(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 n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===pu)return`prune`;uu.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((n,r)=>this.highlightToken({range:nonNullable(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword=t=>createSemanticTypeMethods((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property=(t,n)=>createSemanticTypeMethods((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}));return{node:e,cst,keyword,property}}};const mu=isAnyOf(isElement,isExtendElement);var FqnIndex=class extends ADisposable{projects;langiumDocuments;documentCache;workspaceCache;logger=K.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new $e.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Yn(e.shared,j.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(j.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=j.IndexedContent)}get(e){return e.state<j.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:M.basename(e.uri),state:e.state,expect:j.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=ol.readId(e);if(_(t))return t;let n=qt(e);return n.state<j.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:M.basename(n.uri)}),invariant(isLikeC4LangiumDocument(n)),this.get(n),nonNullable(ol.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return ln(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return ln(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new Ze.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return ln(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new Ze.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return uniqueByName(n)}))}uniqueDescedants(e,t){return ln(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new Ze.default,r=new Ze.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=uniqueByName(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...sortNaturalByFqn(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(mu));if(t.length===0)return hu.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new Ze.default,a=new Ze.default,o=new Ze.default,s=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return ol.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=Fqn(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=w(e.body?.elements??[],mu);if(!T(s,1))return[o];let c=E(s,e=>traverseElement(e,n));for(let e of c)a.set(n,e);return[o,...c]}function traverseExtendElement(e){let t=readStrictFqn(e.element),n=D(e.body?.elements??[],w(isElement),E(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(isExtendElement(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:M.basename(e.uri),error:t})}return new hu(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>compareNatural(e.name,t.name))}var hu=class DocumentFqnIndex{static EMPTY=new DocumentFqnIndex([],new Ze.default,new Ze.default,new Ze.default,fl.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const gu=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{Names;logger=K.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(gu));if(t.length===0)return hu.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new Ze.default,a=new Ze.default,o=new Ze.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return ol.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!_(n))return[];let o=Fqn(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),isDeployedInstance(e))return[c];let l=w(e.body?.elements??[],gu);if(!T(l,1))return[c];let u=E(l,e=>traverseElement(e,o));for(let e of u)a.set(o,e);return[c,...u]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),n=D(e.body?.elements??[],w(gu),E(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(isExtendDeployment(n)){traverseExtend(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:M.basename(e.uri),error:t})}return new hu(r,i,a,o,n)}};const _u=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=_u.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 Ze.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;Ke(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=assignTagColors(n),this.projectId=b(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return K.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,ie(a)&&(a=u.title||nameFromFqn(r)),u.tags&&isNonEmptyArray(u.tags)&&(e=e?C([...u.tags,...e]):u.tags);let d=exact({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),exact({metadata:l&&!f(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ke(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:V.flatten(e.element)};if(`element`in e)return K.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return K.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===nameFromFqn(e.id)&&t.title?t.title:i,exact({...t,...a,title:i,style:exact({...t.style,...r}),id:n})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Ke(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let n of e)if(isElementView$1(n)&&n.viewOf&&g(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=xe(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=C([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=C([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=C([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:T(r,1)?r:null,links:T(n,1)?n:null,...!f(i)&&{metadata:i}}}};function buildModelData(e,t,n){let r=new MergedSpecification(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let o=l(r.specs.colors,e=>computeColorValues(e.color)),s=new Set,c=new MergedExtends,u=new MergedExtends,d=n.flatMap(e=>e.c4ExtendRelations),p=new Set,scanMetadataKeys=e=>{e?.metadata&&a(e.metadata).forEach(e=>s.add(e))},m=D(n,E(e=>(c.merge(e.c4ExtendElements),y(e.c4Elements,r.toModelElement))),w(_),sortParentsFirst,Me((e,t)=>{let n=parentFqn(t.id);return n&&g(e[n])?(K.debug`No parent found for ${t.id}`,e):(e[t.id]=c.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),v=D(n,E(e=>y(e.c4Relations,r.toModelRelation)),w(e=>{if(!e)return!1;let t=V.flatten(e.source),n=V.flatten(e.target);return g(m[t])&&!isGlobalFqn(t)||g(m[n])&&!isGlobalFqn(n)?(K.debug`Invalid relation ${e.id}
|
|
75
|
-
source: ${t} resolved: ${!!
|
|
76
|
-
target: ${n} resolved: ${!!
|
|
77
|
-
source: ${e.source.deployment} resolved: ${!!
|
|
78
|
-
target: ${e.target.deployment} resolved: ${!!
|
|
79
|
-
`,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let b=D(ne,h(S(`id`)));ne.some(isExtendsElementView)&&(b=resolveRulesExtendedViews(b));for(let e of d)p.has(e.astPath)||K.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[B]:`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:r.tags,elements:r.specs.elements,relationships:l(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...s.size>0&&{metadataKeys:[...s].sort(compareNatural)},customColors:o},elements:m,relations:v,globals:r.globals,views:b,deployments:{elements:ee,relations:te},imports:{}},imports:r.imports}}const X=K.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{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,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(Pe(),w(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),y(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(j.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),X.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=X.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,n,r))}catch(t){return X.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=X.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),n.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);T(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}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=X.getChild(e),n=this.unsafeSyncJoinedModelData(e);return n?Gi.create(n):(t.debug`parseModel: returning EMPTY`,Gi.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=X.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return e!==fl.DefaultProjectId&&n.warn`unsafeSyncComputeModel: returning EMPTY`,Gi.EMPTY.asComputed;let i=performanceMark(),a=Gi.create(r),o=[];for(let e of Fe(r.views)){let r=computeView(e,a);if(!r.isSuccess){n.warn(loggable(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),o.push(r.view)}assignNavigateTo(o);let s={...r,manualLayouts:{...t?.views},[B]:`computed`,views:h(o,S(`id`))};return n.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${i.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(Gi.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=X.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Zt(t);let r=this.projects.getProject(e),i=await this.manualLayouts.read(r),a=this.unsafeSyncComputeModel(e,i);return a===Gi.EMPTY&&e!==fl.DefaultProjectId&&n.warn(`computeModel returned EMPTY`),a})}onModelParsed(e){return this.listeners.push(e),wn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){X.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=d(e)?D(e,oe(e=>this.projects.ownerProjectId(e)),je()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){X.warn(loggable(e))}}},ProjectModelCache=class extends Xn{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(j.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)}),e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=C(y(n,t.ownerProjectId.bind(t)));if(!T(r,1))return;X.trace`clear project caches for: ${r} (on delete ${n.map(e=>e.fsPath)})`;for(let e of r)this.clear(e)}}))}parsedData(e,t){let n=`parsed-data`,r=this.get(e,n);if(r!==void 0)return X.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),X.trace`cache miss project ${e} key: ${n}`,i}parsedJoinedData(e,t){let n=`parsed-joined-data`,r=this.get(e,n);if(r!==void 0)return X.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),X.trace`cache miss project ${e} key: ${n}`,i}parsedModel(e,t){let n=`parsed-model`,r=this.get(e,n);if(r!==void 0)return X.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),X.trace`cache miss project ${e} key: ${n}`,i}computedModel(e,t,n){let r=t?`computed-model-${t.hash}`:`computed-model`,i=this.get(e,r);if(i!==void 0)return X.trace`cache hit project ${e} key: ${r}`,i;let a=n();return this.set(e,r,a),X.trace`cache miss project ${e} key: ${r}`,a}};const{findNodeForKeyword:vu,findNodeForProperty:yu}=Jt,{getDocument:bu,streamAllContents:xu}=on,Su=K.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=v(t)?this.projects.ensureProjectId():projectIdFrom(t)),v(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=bu(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Su.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=splitGlobalFqn(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!isRelation(r)&&!isDeploymentRelation(r))continue;let i=r.kind?yu(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?yu(r.$cstNode,`dotKind`):void 0,i??=vu(r.$cstNode,`->`),i??=yu(r.$cstNode,`title`),i??=yu(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(isLikeC4View(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?yu(r.$cstNode,`name`):void 0;return i??=vu(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<j.Linked&&(Su.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(j.Linked,n.uri,t));let r=projectIdFrom(n);Su.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??Ci.DEFAULT;if(!e)return Su.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=D(xu(n.parseResult.value),ifilter(e=>isTag(e)||isTagRef(e)),toArray(),E(n=>{let r,i;try{isTag(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return invariant(a,`Tag ${r} not found in merged specification`),invariant(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:isTag(n)}}catch(e){return Su.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Su.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Su.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!isDynamicView(n)||!n.body)return Su.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!isDynamicViewStep(i))return Su.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?yu(i.$cstNode,`kind`):void 0;return a??=i.dotKind?yu(i.$cstNode,`dotKind`):void 0,a??=vu(i.$cstNode,`->`),a??=vu(i.$cstNode,`<-`),a??=yu(i.$cstNode,`title`),a??=yu(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const Cu=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,n,r){try{let i=e(t,n,r);u(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),K.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:wu}=on,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=nonNullable(n.getNameNode(e),`name CstNode not found`).range;Cu.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=nonNullable(n.getNameNode(e),`name CstNode not found`).range;Cu.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=wu(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){K.warn(loggable(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(V.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(V.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(V.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(V.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}isSameHierarchy(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!isDeploymentNode(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=elementRef(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=elementRef(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(isAncestor(i,o)||isAncestor(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},dynamicViewStepChain=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=e.source;isDynamicStepSingle(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=elementRef(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(f(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}Xt(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:Tu}=on,checkElement=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return tryOrLog((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}Cu.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=Tu(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(projectIdFrom(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Eu}=on,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=projectIdFrom(Eu(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let n=e.$container;n.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(n)&&isElementBody(n.$container)&&n.$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||v(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=p(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!p(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!p(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!p(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),p(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),v(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}nonexhaustive(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(qt(e)),i=safeCall(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=safeCall(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}V.isImportRef(i)&&(V.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),isSameHierarchy(V.flatten(i),V.flatten(a))&&n(`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,n=new Yn(e.shared,j.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>stringHash(`extend-relation`,V.flatten(e),V.flatten(t),n??`default`,r??``);function getProjectFingerprints(t){return n.get(t,()=>new Set(D(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),E(e=>e.c4Relations??[]),y(e=>calcFingerprint(e)))))}return tryOrLog((e,n)=>{let r=qt(e),i=t.forDocument(r),a=safeCall(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=safeCall(()=>i.parseFqnRef(e.target));if(!o){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!V.isModelRef(a)&&!V.isImportRef(a)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!V.isModelRef(o)&&!V.isImportRef(o)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let s=projectIdFrom(r),c=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:l=``}=i.parseBaseProps({},{title:e.title}),u=calcFingerprint({source:a,target:o,kind:c,title:l});getProjectFingerprints(s).has(u)||n(`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,n)=>{Cu.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,ns).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==qt(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{Cu.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,zo).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==qt(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=e.name,i=projectIdFrom(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==qt(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{Cu.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e);t.projectElements(r,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=projectIdFrom(e),i=t.projectElements(r,Ts),a=t.projectElements(r,ws);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=projectIdFrom(e);t.projectElements(r,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},Du=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=Yt(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Du.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;Cu.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=projectIdFrom(e);t.projectElements(i,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let n=collectFqnExprs(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(isFqnRefExpr),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!areSame(i,a?.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,n)=>{let r=getViewRulePredicateContainer(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(qt(r)),o=H.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case H.isWildcard(o)&&i:case H.isElementKindExpr(o)&&i:case H.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case H.isWildcard(o):case H.isModelRef(o):case H.isDeploymentRef(o):return;case H.isElementKindExpr(o):case H.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:nonexhaustive(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(qt(e)).parseFqnRefExpr(e),i=getViewRulePredicateContainer(e),a=isFqnRefInsideDeployment(e)&&!Xt(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!Xt(e,isRelationExpr)){if(H.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(H.isDeploymentRef(r)&&V.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}_(e.selector)&&!isDeploymentNode(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case H.isElementKindExpr(r):case H.isElementTagExpr(r):case H.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)&&g(cn(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 n=cn(e,isElementView);n&&g(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=cn(e,isDeploymentViewRulePredicate);if(!r||r.isInclude!==!0)return;let i=qt(e),a=t.forDocument(i),o=yi.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(yi.isDirect(o)){(H.isModelRef(o.source)||H.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=yi.isIncoming(o)?o.incoming:yi.isOutgoing(o)?o.outgoing:o.inout,H.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=getViewRulePredicateContainer(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends Gn{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};Ln();const Ou=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(Ou(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=j.Validated?e.diagnostics?.filter(e=>e.severity===mn.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(g(e)||n.has(e))continue;n.add(e);let t=findInvalidContainer(e);t&&n.add(t)}let isValid=e=>!n.has(e);return{isValid,invalidNodes:n}}function registerValidationChecks(e){K.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),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,n)=>{for(let e of n)K.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>K.error(loggable(e)))})})}const ku=K.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return v(t)?t.split(`
|
|
86
|
+
`)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Ru,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let printViewLink=e=>{let n=[e.id,t],r=P.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},a=[...e.scopedViews()].map(printViewLink);a.length>0&&n.push(Ru,`<small>Element views:</small>`,...a);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(o);if(s.length>0){let e=a.length>0?`Also appears in views:`:`Appears in views:`;n.push(a.length>0?``:Ru,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
|
|
87
|
+
`):void 0}getDeploymentNodeHover(e){let t=cn(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=preferSummary(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
|
|
88
|
+
`)}}}getDeployedInstanceHover(e){let t=cn(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=W.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${W.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
|
|
89
|
+
`)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};Xn();const zu=J.getChild(`SemanticTokenProvider`),Bu={...En},Vu={...Nn};function createSemanticTypeMethods(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Vu)return t.push(Vu[i]),n;if(i in Bu)return()=>e(Bu[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Hu=`Stop Highlighting`,stopHighlight=()=>{throw Hu};var LikeC4SemanticTokenProvider=class extends xn{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};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=>{_(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=>{_(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(isAnyOf(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{_(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=>{_(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=>{_(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=>{_(e.node.value)&&e.property(`value`).string()}),when(isAnyOf(isColorProperty,isIconColorProperty),e=>{_(e.node.customColor)&&e.property(`customColor`).enum(),_(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!isAnyOf(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&_(e.key),e=>e.property(`key`).property()),when(isAnyOf(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{_(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 n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Hu)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((n,r)=>this.highlightToken({range:nonNullable(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword=t=>createSemanticTypeMethods((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property=(t,n)=>createSemanticTypeMethods((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}));return{node:e,cst,keyword,property}}};const Uu=isAnyOf(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=J.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new Xe.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Gt(e.shared,N.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(N.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=N.IndexedContent)}get(e){return e.state<N.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:F.basename(e.uri),state:e.state,expect:N.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=jl.readId(e);if(_(t))return t;let n=cn(e);return n.state<N.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:F.basename(n.uri)}),invariant(isLikeC4LangiumDocument(n)),this.get(n),nonNullable(jl.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return Kn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return Kn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new Je.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return Kn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new Je.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return uniqueByName(n)}))}uniqueDescedants(e,t){return Kn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new Je.default,r=new Je.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=uniqueByName(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...sortNaturalByFqn(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Uu));if(t.length===0)return Wu.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new Je.default,a=new Je.default,o=new Je.default,s=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return jl.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=Fqn(e.name,t),o=createAndSaveDescription(e,e.name,n);t?i.set(t,o):r.push(o);let s=O(e.body?.elements??[],Uu);if(!D(s,1))return[o];let c=k(s,e=>traverseElement(e,n));for(let e of c)a.set(n,e);return[o,...c]}function traverseExtendElement(e){let t=readStrictFqn(e.element),n=E(e.body?.elements??[],O(isElement),k(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(isExtendElement(n)){traverseExtendElement(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:F.basename(e.uri),error:t})}return new Wu(r,i,a,o,n)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>compareNatural(e.name,t.name))}var Wu=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new Je.default,new Je.default,new Je.default,Ll.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Gu=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=J.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(Gu));if(t.length===0)return Wu.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new Je.default,a=new Je.default,o=new Je.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return jl.writeId(t,i),o.set(i,a),a};function traverseElement(e,t){let n=s.getName(e);if(!_(n))return[];let o=Fqn(n,t),c=createAndSaveDescription(e,n,o);if(t?i.set(t,c):r.push(c),isDeployedInstance(e))return[c];let l=O(e.body?.elements??[],Gu);if(!D(l,1))return[c];let u=k(l,e=>traverseElement(e,o));for(let e of u)a.set(o,e);return[c,...u]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),n=E(e.body?.elements??[],O(Gu),k(e=>traverseElement(e,t)));if(n.length!==0)for(let e of[t,...ancestorsFqn(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(isExtendDeployment(n)){traverseExtend(n);continue}traverseElement(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:F.basename(e.uri),error:t})}return new Wu(r,i,a,o,n)}};const Ku=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Ku.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 Je.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,s=t.likec4ProjectId;o(s)&&(r.length===0||r[0]!==s)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=assignTagColors(n),this.projectId=x(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return J.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,f(a)&&(a=u.title||nameFromFqn(r)),u.tags&&isNonEmptyArray(u.tags)&&(e=e?T([...u.tags,...e]):u.tags);let d=exact({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=deriveTechnologyFromIcon(d.icon)),exact({metadata:l&&!S(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...s})=>{if(o(r)&&this.specs.relationships[r]){let{multiple:e,...o}=this.specs.relationships[r];return{...o,...s,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...i&&{links:i},...s,source:t,target:n,id:a}};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:W.flatten(e.element)};if(`element`in e)return J.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return J.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===nameFromFqn(e.id)&&t.title?t.title:i,exact({...t,...a,title:i,style:exact({...t.style,...r}),id:n})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...s})=>{if(o(r)&&this.specs.relationships[r]){let{multiple:e,...o}=this.specs.relationships[r];return{...o,...s,...i&&{links:i},source:t,target:n,kind:r,id:a}}return{...i&&{links:i},...s,source:t,target:n,id:a}}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let n of e)if(isElementView$1(n)&&n.viewOf&&b(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=ce(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=T([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=T([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=T([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:D(r,1)?r:null,links:D(n,1)?n:null,...!S(i)&&{metadata:i}}}};function buildModelData(e,t,n){let r=new MergedSpecification(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=l(r.specs.colors,e=>computeColorValues(e.color)),o=new Set,s=new MergedExtends,c=new MergedExtends,u=n.flatMap(e=>e.c4ExtendRelations),d=new Set,scanMetadataKeys=e=>{e?.metadata&&a(e.metadata).forEach(e=>o.add(e))},f=E(n,k(e=>(s.merge(e.c4ExtendElements),y(e.c4Elements,r.toModelElement))),O(_),sortParentsFirst,Ae((e,t)=>{let n=parentFqn(t.id);return n&&b(e[n])?(J.debug`No parent found for ${t.id}`,e):(e[t.id]=s.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),p=E(n,k(e=>y(e.c4Relations,r.toModelRelation)),O(e=>{if(!e)return!1;let t=W.flatten(e.source),n=W.flatten(e.target);return b(f[t])&&!isGlobalFqn(t)||b(f[n])&&!isGlobalFqn(n)?(J.debug`Invalid relation ${e.id}
|
|
90
|
+
source: ${t} resolved: ${!!f[t]}
|
|
91
|
+
target: ${n} resolved: ${!!f[n]}\n`,!1):!0}),y(e=>{let t=stringHash(`extend-relation`,W.flatten(e.source),W.flatten(e.target),e.kind??`default`,e.title??``),n=u.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>d.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=T([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=T(r),s=i;return{...e,...D(o,1)&&{tags:o},...D(s,1)&&{links:s},...!S(a)&&{metadata:a}}}),pe(scanMetadataKeys),Me(w(`id`))),m=E(n,k(e=>(c.merge(e.c4ExtendDeployments),y(e.c4Deployments,r.toDeploymentElement))),O(_),sortParentsFirst,Ae((e,t)=>{let n=parentFqn(t.id);return n&&b(e[n])?(J.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=isDeploymentNode$1(t)?c.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),h=E(n,k(e=>y(e.c4DeploymentRelations,r.toDeploymentRelation)),O(e=>e?b(m[e.source.deployment])||b(m[e.target.deployment])?(J.debug`Invalid deployment relation ${e.id}
|
|
92
|
+
source: ${e.source.deployment} resolved: ${!!m[e.source.deployment]}
|
|
93
|
+
target: ${e.target.deployment} resolved: ${!!m[e.target.deployment]}\n`,!1):!0:!1),Ae((e,t)=>C(e[t.id])?(J.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e._type===`element`&&b(i)&&`viewOf`in e&&(i=f[e.viewOf]?.title??null),b(i)&&r===`index`&&(i=`Landscape view`),{...He(s,e=>e===void 0),[U]:`parsed`,sourcePath:F.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>y(e.c4Views,toC4View(e)));if(g.some(e=>e.id===`index`)||g.unshift({[U]:`parsed`,[Li]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of g)t._type===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of a(f)){if(e.has(n)||isGlobalFqn(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[U]:`parsed`,[Li]:`element`,id:r,viewOf:n,title:`Auto / ${(f[n]?.title??n).replaceAll(`
|
|
94
|
+
`,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let v=E(g,Me(w(`id`)));g.some(isExtendsElementView)&&(v=resolveRulesExtendedViews(v));for(let e of u)d.has(e.astPath)||J.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[U]:`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:r.tags,elements:r.specs.elements,relationships:l(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...o.size>0&&{metadataKeys:[...o].sort(compareNatural)},customColors:i},elements:f,relations:p,globals:r.globals,views:v,deployments:{elements:m,relations:h},imports:{}},imports:r.imports}}const qu=J.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,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=Be(m(),O(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),y(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(N.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),qu.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=qu.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,n,r))}catch(t){return qu.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=qu.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),n.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);D(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}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=qu.getChild(e),n=this.unsafeSyncJoinedModelData(e);return n?ha.create(n):(t.debug`parseModel: returning EMPTY`,ha.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=qu.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return e!==Ll.DefaultProjectId&&n.warn`unsafeSyncComputeModel: returning EMPTY`,ha.EMPTY.asComputed;let i=performanceMark(),a=ha.create(r),o=[];for(let e of Ne(r.views)){let r=computeView(e,a);if(!r.isSuccess){n.warn(loggable(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),o.push(r.view)}assignNavigateTo(o);let s={...r,manualLayouts:{...t?.views},[U]:`computed`,views:Me(o,w(`id`))};return n.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${i.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(ha.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=qu.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await Xt(t);let r=this.projects.getProject(e),i=await this.manualLayouts.read(r),a=this.unsafeSyncComputeModel(e,i);return a===ha.EMPTY&&e!==Ll.DefaultProjectId&&n.warn(`computeModel returned EMPTY`),a})}onModelParsed(e){return this.listeners.push(e),hn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){qu.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=h(e)?E(e,oe(e=>this.projects.ownerProjectId(e)),Ie()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){qu.warn(loggable(e))}}},ProjectModelCache=class extends Zn{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(N.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)}),e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=T(y(n,t.ownerProjectId.bind(t)));if(!D(r,1))return;qu.trace`clear project caches for: ${r} (on delete ${n.map(e=>e.fsPath)})`;for(let e of r)this.clear(e)}}))}parsedData(e,t){let n=`parsed-data`,r=this.get(e,n);if(r!==void 0)return qu.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),qu.trace`cache miss project ${e} key: ${n}`,i}parsedJoinedData(e,t){let n=`parsed-joined-data`,r=this.get(e,n);if(r!==void 0)return qu.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),qu.trace`cache miss project ${e} key: ${n}`,i}parsedModel(e,t){let n=`parsed-model`,r=this.get(e,n);if(r!==void 0)return qu.trace`cache hit project ${e} key: ${n}`,r;let i=t();return this.set(e,n,i),qu.trace`cache miss project ${e} key: ${n}`,i}computedModel(e,t,n){let r=t?`computed-model-${t.hash}`:`computed-model`,i=this.get(e,r);if(i!==void 0)return qu.trace`cache hit project ${e} key: ${r}`,i;let a=n();return this.set(e,r,a),qu.trace`cache miss project ${e} key: ${r}`,a}};const{findNodeForKeyword:Ju,findNodeForProperty:Yu}=Bn,{getDocument:Xu,streamAllContents:Zu}=Jt,Qu=J.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,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=v(t)?this.projects.ensureProjectId():projectIdFrom(t)),v(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=Xu(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return Qu.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=splitGlobalFqn(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!isRelation(r)&&!isDeploymentRelation(r))continue;let i=r.kind?Yu(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?Yu(r.$cstNode,`dotKind`):void 0,i??=Ju(r.$cstNode,`->`),i??=Yu(r.$cstNode,`title`),i??=Yu(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(isLikeC4View(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?Yu(r.$cstNode,`name`):void 0;return i??=Ju(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<N.Linked&&(Qu.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(N.Linked,n.uri,t));let r=projectIdFrom(n);Qu.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??Wi.DEFAULT;if(!e)return Qu.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=E(Zu(n.parseResult.value),ifilter(e=>isTag(e)||isTagRef(e)),toArray(),k(n=>{let r,i;try{isTag(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return invariant(a,`Tag ${r} not found in merged specification`),invariant(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:isTag(n)}}catch(e){return Qu.warn(`Fail on tag ${r}`,{err:e}),[]}}));return Qu.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return Qu.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!isDynamicView(n)||!n.body)return Qu.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!isDynamicViewStep(i))return Qu.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?Yu(i.$cstNode,`kind`):void 0;return a??=i.dotKind?Yu(i.$cstNode,`dotKind`):void 0,a??=Ju(i.$cstNode,`->`),a??=Ju(i.$cstNode,`<-`),a??=Yu(i.$cstNode,`title`),a??=Yu(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const $u=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,n,r){try{let i=e(t,n,r);u(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),J.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:ed}=Jt,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=nonNullable(n.getNameNode(e),`name CstNode not found`).range;$u.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return tryOrLog((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=nonNullable(n.getNameNode(e),`name CstNode not found`).range;$u.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=projectIdFrom(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=ed(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){J.warn(loggable(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(W.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(W.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(W.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(W.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}isSameHierarchy(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!isDeploymentNode(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),dynamicViewStepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=elementRef(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=elementRef(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(isAncestor(i,o)||isAncestor(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},dynamicViewStepChain=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,n)=>{let r=e.source;isDynamicStepSingle(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=elementRef(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(S(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}un(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:td}=Jt,checkElement=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return tryOrLog((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}$u.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=td(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(projectIdFrom(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:nd}=Jt,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=projectIdFrom(nd(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let n=e.$container;n.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(n)&&isElementBody(n.$container)&&n.$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||v(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=g(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!g(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!g(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!g(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),g(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),v(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}nonexhaustive(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(cn(e)),i=safeCall(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=safeCall(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}W.isImportRef(i)&&(W.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),isSameHierarchy(W.flatten(i),W.flatten(a))&&n(`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,n=new Gt(e.shared,N.Linked),calcFingerprint=({source:e,target:t,kind:n,title:r})=>stringHash(`extend-relation`,W.flatten(e),W.flatten(t),n??`default`,r??``);function getProjectFingerprints(t){return n.get(t,()=>new Set(E(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),k(e=>e.c4Relations??[]),y(e=>calcFingerprint(e)))))}return tryOrLog((e,n)=>{let r=cn(e),i=t.forDocument(r),a=safeCall(()=>i.parseFqnRef(e.source));if(!a){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let o=safeCall(()=>i.parseFqnRef(e.target));if(!o){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!W.isModelRef(a)&&!W.isImportRef(a)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!W.isModelRef(o)&&!W.isImportRef(o)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let s=projectIdFrom(r),c=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:l=``}=i.parseBaseProps({},{title:e.title}),u=calcFingerprint({source:a,target:o,kind:c,title:l});getProjectFingerprints(s).has(u)||n(`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,n)=>{$u.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,Ds).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==cn(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{$u.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e),i=t.projectElements(r,us).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==cn(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=e.name,i=projectIdFrom(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==cn(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{$u.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=projectIdFrom(e);t.projectElements(r,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=projectIdFrom(e),i=t.projectElements(r,Ys),a=t.projectElements(r,Js);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=projectIdFrom(e);t.projectElements(r,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},rd=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,n)=>{let r=Bt(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&rd.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;$u.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=projectIdFrom(e);t.projectElements(i,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function collectFqnExprs(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let n=collectFqnExprs(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(isFqnRefExpr),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!areSame(i,a?.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,n)=>{let r=getViewRulePredicateContainer(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(cn(r)),o=G.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case G.isWildcard(o)&&i:case G.isElementKindExpr(o)&&i:case G.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case G.isWildcard(o):case G.isModelRef(o):case G.isDeploymentRef(o):return;case G.isElementKindExpr(o):case G.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:nonexhaustive(o)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=t.forDocument(cn(e)).parseFqnRefExpr(e),i=getViewRulePredicateContainer(e),a=isFqnRefInsideDeployment(e)&&!un(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!un(e,isRelationExpr)){if(G.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(G.isDeploymentRef(r)&&W.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}_(e.selector)&&!isDeploymentNode(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case G.isElementKindExpr(r):case G.isElementTagExpr(r):case G.isWildcard(r):n(`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)&&b(ln(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 n=ln(e,isElementView);n&&b(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,n)=>{let r=ln(e,isDeploymentViewRulePredicate);if(!r||r.isInclude!==!0)return;let i=cn(e),a=t.forDocument(i),o=Bi.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(Bi.isDirect(o)){(G.isModelRef(o.source)||G.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=Bi.isIncoming(o)?o.incoming:Bi.isOutgoing(o)?o.outgoing:o.inout,G.isModelRef(c)){n(`error`,s,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let n=getViewRulePredicateContainer(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends Tn{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};Xn();const id=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(id(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=N.Validated?e.diagnostics?.filter(e=>e.severity===Jn.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(b(e)||n.has(e))continue;n.add(e);let t=findInvalidContainer(e);t&&n.add(t)}let isValid=e=>!n.has(e);return{isValid,invalidNodes:n}}function registerValidationChecks(e){J.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),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,n)=>{for(let e of n)J.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>J.error(loggable(e)))})})}const ad=J.getChild(`parser`);function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return v(t)?t.split(`
|
|
80
95
|
`).join(` `):`md`in t?{md:t.md.split(`
|
|
81
96
|
`).join(` `)}:{txt:t.txt.split(`
|
|
82
|
-
`).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case v(e):return yr(e).trim();case isMarkdownOrString(e)&&v(e.markdown):return{md:yr(e.markdown).trim()};case isMarkdownOrString(e)&&v(e.text):return{txt:yr(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}var BaseParser=class{isValid;docUri;docPathInProject;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=M.relative(n.folderUri,t.uri)}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Wn(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?ku.getChild(n).debug(r):ku.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return E(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),n=this.resolveFqn(nonNullable(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),GlobalFqn(t,n)}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)||f(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return _(t)?[t]:[];{let e=t.md||t.txt;return _(e)?[e]:[]}}else if(isMetadataArray(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(_);return[]},t=D(e.props,E(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),w(([e,t])=>_(t)));if(f(t))return;let n=D(t,oe(([e])=>e),l(e=>e.map(([e,t])=>t))),r={};for(let[e,t]of Object.entries(n))t&&t.length>0&&(r[e]=t.length===1?t[0]:t);return f(r)?void 0:r}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 n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>nonNullable(e.tag.ref,`Tag reference is not resolved`).name).filter(_)),t=t.prev;return isNonEmptyArray(n)?C(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,w(e.props,isLinkProperty),e=>{let t=e.value;if(ie(t))return;let n=_(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return exact({url:t,title:n,relative:r&&r!==t?r:void 0})});return isNonEmptyArray(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&mr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&ur(n):return sr(this.doc.uri.toString(),`../`,n);case n&&fr(n):return pr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){ku.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?pr(i,r):i;return pr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=p(e.alpha)?e.alpha:void 0;return v(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(d(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let n=this.parseIconProperty(e.find(isIconProperty));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case isBorderProperty(n):_(n.value)&&(t.border=n.value);break;case isColorProperty(n):{let e=toColor(n);_(e)&&(t.color=e);break}case isShapeProperty(n):_(n.value)&&(t.shape=n.value);break;case isIconProperty(n):{let e=this.parseIconProperty(n);_(e)&&(t.icon=e);break}case isIconColorProperty(n):{let e=toColor(n);_(e)&&(t.iconColor=e);break}case isIconSizeProperty(n):_(n.value)&&(t.iconSize=parseAstSizeValue(n));break;case isIconPositionProperty(n):_(n.value)&&(t.iconPosition=parseAstIconPositionValue(n));break;case isOpacityProperty(n):t.opacity=parseAstOpacityProperty(n);break;case isMultipleProperty(n):t.multiple=ae(n.value)?n.value:!1;break;case isShapeSizeProperty(n):_(n.value)&&(t.size=parseAstSizeValue(n));break;case isPaddingSizeProperty(n):_(n.value)&&(t.padding=parseAstSizeValue(n));break;case isTextSizeProperty(n):_(n.value)&&(t.textSize=parseAstSizeValue(n));break;default:nonexhaustive(n)}}catch(e){this.logError(e,n)}return exact(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??parseMarkdownAsString(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return exact({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology))})}};function*streamDeploymentModel(e){let t=tt.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(isDeploymentRelation(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function 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 n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:nonexhaustive(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=nonNullable(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(isMetadataProperty)),l=D(e.body?.props??[],w(t),w(isElementStringProperty),c(e=>[e.key,e.value])),{title:u,...d}=this.parseBaseProps(l,{title:e.title,summary:e.summary});return exact({id:n,kind:r,title:u??nameFromFqn(n),...d,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);invariant(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=D(e.body?.props??[],w(t),w(isElementStringProperty),c(e=>[e.key,e.value])),l=this.parseBaseProps(s,{title:e.title,summary:e.summary});return exact({id:n,element:r,tags:i,links:this.parseLinks(e.body),...l,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(isMetadataProperty)),r=this.parseLinks(e.body);return!t&&f(n??{})&&!r?null:exact({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(x(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);invariant(V.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);invariant(V.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,l=this.getMetadata(e.body?.props.find(isMetadataProperty)),u=D(e.body?.props??[],w(isRelationStringProperty),w(e=>_(e.value)),c(e=>[e.key,e.value])),d=D(e.body?.props??[],w(isRelationNavigateToProperty),ke())?.value.view.ref?.name,f=this.parseBaseProps(u,{title:e.title}),p=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(`deployment`,this.docUri,n,r.deployment,i.deployment),source:r,target:i,...f,metadata:l,kind:s,tags:a,links:o,...toRelationshipStyle(p?.props,t),navigateTo:d,astPath:n})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;invariant(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+stringHash(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(D(n,w(isViewStringProperty),c(e=>[e.key,e.value]))),s=this.convertTags(t),l=this.convertLinks(t);return al.writeId(e,i),{[gi]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:isNonEmptyArray(l)?l: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(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);nonexhaustive(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Ke(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),n=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const parseMetadataEquals=({operator:e,not:t},n)=>e?.startsWith(`!=`)?{neq:n}:e?.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n},parseEquals=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};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,n=parseParticipant(e);invariant(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case isWhereKindEqual(e):{let t=e.value?.ref?.name,n=parseParticipant(e);invariant(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case isWhereMetadataEqual(e):{let t=e.key,n=parseParticipant(e);invariant(t,`Expected metadata key`);let r={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return n?{participant:n,operator:r}:r}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:nonexhaustive(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[isAndOperator(t)?t.and:t,isAndOperator(n)?n.and:n].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[isOrOperator(t)?t.or:t,isOrOperator(n)?n.or:n].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 n=importsRef(e);if(n){let e={project:projectIdFrom(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=instanceRef(e);return r?{deployment:this.resolveFqn(r),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 n=t.value.view.$refText;return _(n)&&(e.custom.navigateTo=n),e}if(isNotesProperty(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(parseMarkdownAsString(t.value));return n&&(e.custom[t.key]=n),e}if(isIconProperty(t)){let n=this.parseIconProperty(t);return x(n)&&(e.custom[t.key]=n),e}if(isColorProperty(t)){let n=toColor(t);return x(n)&&(e.custom[t.key]=n),e}if(isShapeProperty(t)||isBorderProperty(t))return x(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return x(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let n=toColor(t);return x(n)&&(e.custom[t.key]=n),e}if(isNotationProperty(t)){let n=_(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(isMultipleProperty(t))return ae(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return _(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return _(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=[],n=e;for(;n;){try{Ke(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(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 n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(parseMarkdownAsString(t.value));return n&&(e[t.key]=n),e}if(isArrowProperty(t))return _(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let n=toColor(t);return _(n)&&(e[t.key]=n),e}if(isLineProperty(t))return _(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let n=t.value.view.ref?.name;return _(n)&&(e[t.key]=n),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),n=t.where?.expr??t,r=t.where?.condition,i=e.where?parseWhereClause(e.where):null,a;return a=i&&r?createBinaryOperator(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default: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,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!_(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!_(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);T(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(isGlobalPredicateGroup(e)){let r=this.parseGlobalPredicateGroup(e);T(r,1)&&(n.predicates[t]=r);return}if(isGlobalDynamicPredicateGroup(e)){let r=this.parseGlobalDynamicPredicateGroup(e);T(r,1)&&(n.dynamicPredicates[t]=r);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,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(nonNullable(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*streamModel(e){let t=tt.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(isRelation(r)){n.push(r);continue}if(isExtendRelation(r)){n.push(r);continue}if(r.body?.elements&&T(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}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 n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(isExtendRelation(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}nonexhaustive(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=nonNullable(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.getAstNodePath(e),[l,u,d]=e.props??[],f=D(e.body?.props??[],w(t),w(isElementStringProperty),c(e=>[e.key,e.value])),{title:p,...m}=this.parseBaseProps(f,{title:l,summary:u,technology:d});return exact({id:n,kind:r,astPath:s,title:p,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...m,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(isMetadataProperty)),r=this.parseLinks(e.body);if(!t&&ie(n)&&!r)return null;let i=this.getAstNodePath(e);return exact({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);invariant(V.isModelRef(t)||V.isImportRef(t),`Source must be a model reference`),invariant(V.isModelRef(n)||V.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(isMetadataProperty)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&f(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return exact({id:stringHash(`extend-relation`,V.flatten(t),V.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(x(e.source)){let t=this.parseFqnRef(e.source);return invariant(V.isModelRef(t)||V.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,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);invariant(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(isMetadataProperty)),l=this.getAstNodePath(e),u=D(e.body?.props??[],w(isRelationStringProperty),w(e=>_(e.value)),c(e=>[e.key,e.value])),d=D(e.body?.props??[],w(isRelationNavigateToProperty),y(e=>e.value.view.ref?.name),w(_),ke()),{title:f=``,description:p,technology:m}=this.parseBaseProps(u,{title:e.title,description:e.description,technology:e.technology}),h=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(this.docUri,l,V.flatten(n),V.flatten(r)),astPath:l,source:n,target:r,title:f,metadata:s,kind:o,tags:i,links:a,navigateTo:d,description:p,technology:m,...toRelationshipStyle(h?.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,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!_(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=D(n.filter(isSpecificationRelationshipStringProperty)??[],w(e=>this.isValid(e)&&Ke(e.value)),c(e=>[e.key,removeIndent(parseMarkdownAsString(e.value))]),Ue(g));t.relationships[r]={...i,...toRelationshipStyle(n.filter(isRelationshipStyleProperty),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}_(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:nonNullable(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!_(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(isElementStyleProperty)),o=this.parseLinks(e),s=D(n.filter(isSpecificationElementStringProperty)??[],w(e=>this.isValid(e)),c(e=>[e.key,e.value])),l=this.parseBaseProps(s),u=removeIndent(parseMarkdownAsString(s.notation));return{[r]:exact({...l,notation:u,tags:i??void 0,...o&&isNonEmptyArray(o)&&{links:o},style:a})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!f(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case isElementView(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case isDynamicView(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case isDeploymentView(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:nonexhaustive(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;invariant(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=elementRef(e.viewOf),n=t&&safeCall(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+stringHash(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(D(n.props,w(e=>this.isValid(e)),w(isViewStringProperty),c(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n),d={[gi]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:l,links:isNonEmptyArray(u)?u:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(al.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return invariant(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}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=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);nonexhaustive(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(isViewRulePredicate(n)){t.push(this.parseViewRulePredicate(n));continue}if(isViewRuleGroup(n)){t.push(this.parseViewRuleGroup(n));continue}nonexhaustive(n)}catch(e){this.logError(e,n,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>xi.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>xi.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;invariant(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+stringHash(this.doc.uri.toString(),a);let{title:s=null,description:l=null}=this.parseBaseProps(D(i,w(isViewStringProperty),c(e=>[e.key,e.value]))),u=this.convertTags(n),d=this.convertLinks(n);al.writeId(e,o);let f=xe(i,isDynamicViewDisplayVariantProperty)?.value;return{[gi]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:l,tags:u,links:isNonEmptyArray(d)?d:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.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=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(isFqnExprOrWith(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=pathInsideDynamicView(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return invariant(isNonEmptyArray(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}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 n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!isNonEmptyArray(n)||!this.isValid(e))return[];let r=Ce(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=elementRef(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=elementRef(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:pathInsideDynamicView(e)},r=removeIndent(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;_(e)&&(n.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(x(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(parseMarkdownAsString(t.value))??``;break;case isNotesProperty(t):x(t.value)&&(n[t.key]=removeIndent(t.value));break;case isArrowProperty(t):x(t.value)&&(n[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);x(e)&&(n[t.key]=e);break}case isLineProperty(t):x(t.value)&&(n[t.key]=t.value);break;default:nonexhaustive(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!isDynamicViewBody(t);)p(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}Ln();const Au=D(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends Au{};const ju=K.getChild(`parser`),isError=e=>e.severity===mn.Error;var LikeC4ModelParser=class{cachedParsers=new $e.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(j.Linked,async e=>{this.cachedParsers.has(e)&&(ju.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:M.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(j.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(j.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(ju.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:M.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),n=M.relative(t.folderUri,e.uri);e.likec4ProjectId?ju.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):ju.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<j.Linked&&ju.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new Ze.default(Set)};e=Object.assign(e,r);let i=new DocumentParser(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},LikeC4ValueConverter=class extends en{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Kt.convertString(t)):super.runConverter(e,t,n)}};Ln();const{findNodeForKeyword:Mu}=Jt,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...je(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!isViewRuleStyle(n)&&!isDeploymentViewRuleStyle(n))return!1;let r=n.targets.value;if(!r||_(n.targets.prev)||r.$type!==`FqnRefExpr`||_(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function changeElementStyle(e,{view:t,viewAst:n,targets:r,style:i}){invariant(n.body,`View ${t.id} has no body`);let a=n.$cstNode;invariant(a,`viewCstNode`);let o=Ce(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;invariant(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=w(n.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),u=t._type===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Ie(l,isMatchingViewRule(e,c)),n=u&&isAncestor(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},includeRange=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},m=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>asViewStyleRule(e,i,s));m.push(Sn.insert(o,`
|
|
97
|
+
`).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case v(e):return Lr(e).trim();case isMarkdownOrString(e)&&v(e.markdown):return{md:Lr(e.markdown).trim()};case isMarkdownOrString(e)&&v(e.text):return{txt:Lr(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=F.relative(n.folderUri,t.uri)}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ln(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?ad.getChild(n).debug(r):ad.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return k(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),n=this.resolveFqn(nonNullable(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),GlobalFqn(t,n)}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)||S(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return _(t)?[t]:[];{let e=t.md||t.txt;return _(e)?[e]:[]}}else if(isMetadataArray(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(_);return[]},t=E(e.props,k(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),O(([e,t])=>_(t)));if(S(t))return;let n=E(t,oe(([e])=>e),l(e=>e.map(([e,t])=>t))),r={};for(let[e,t]of Object.entries(n))t&&t.length>0&&(r[e]=t.length===1?t[0]:t);return S(r)?void 0:r}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 n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>nonNullable(e.tag.ref,`Tag reference is not resolved`).name).filter(_)),t=t.prev;return isNonEmptyArray(n)?T(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,O(e.props,isLinkProperty),e=>{let t=e.value;if(f(t))return;let n=_(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return exact({url:t,title:n,relative:r&&r!==t?r:void 0})});return isNonEmptyArray(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Mr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&Or(n):return Tr(this.doc.uri.toString(),`../`,n);case n&&Ar(n):return jr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){ad.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?jr(i,r):i;return jr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=g(e.alpha)?e.alpha:void 0;return v(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(h(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let n=this.parseIconProperty(e.find(isIconProperty));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case isBorderProperty(n):_(n.value)&&(t.border=n.value);break;case isColorProperty(n):{let e=toColor(n);_(e)&&(t.color=e);break}case isShapeProperty(n):_(n.value)&&(t.shape=n.value);break;case isIconProperty(n):{let e=this.parseIconProperty(n);_(e)&&(t.icon=e);break}case isIconColorProperty(n):{let e=toColor(n);_(e)&&(t.iconColor=e);break}case isIconSizeProperty(n):_(n.value)&&(t.iconSize=parseAstSizeValue(n));break;case isIconPositionProperty(n):_(n.value)&&(t.iconPosition=parseAstIconPositionValue(n));break;case isOpacityProperty(n):t.opacity=parseAstOpacityProperty(n);break;case isMultipleProperty(n):t.multiple=d(n.value)?n.value:!1;break;case isShapeSizeProperty(n):_(n.value)&&(t.size=parseAstSizeValue(n));break;case isPaddingSizeProperty(n):_(n.value)&&(t.padding=parseAstSizeValue(n));break;case isTextSizeProperty(n):_(n.value)&&(t.textSize=parseAstSizeValue(n));break;default:nonexhaustive(n)}}catch(e){this.logError(e,n)}return exact(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??parseMarkdownAsString(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return exact({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology))})}};function*streamDeploymentModel(e){let t=Qe.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(isDeploymentRelation(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function 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 n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:nonexhaustive(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=nonNullable(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(isMetadataProperty)),l=E(e.body?.props??[],O(t),O(isElementStringProperty),c(e=>[e.key,e.value])),{title:u,...d}=this.parseBaseProps(l,{title:e.title,summary:e.summary});return exact({id:n,kind:r,title:u??nameFromFqn(n),...d,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);invariant(W.isModelRef(r)||W.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=E(e.body?.props??[],O(t),O(isElementStringProperty),c(e=>[e.key,e.value])),l=this.parseBaseProps(s,{title:e.title,summary:e.summary});return exact({id:n,element:r,tags:i,links:this.parseLinks(e.body),...l,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(isMetadataProperty)),r=this.parseLinks(e.body);return!t&&S(n??{})&&!r?null:exact({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(C(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);invariant(W.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);invariant(W.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,l=this.getMetadata(e.body?.props.find(isMetadataProperty)),u=E(e.body?.props??[],O(isRelationStringProperty),O(e=>_(e.value)),c(e=>[e.key,e.value])),d=E(e.body?.props??[],O(isRelationNavigateToProperty),Pe())?.value.view.ref?.name,f=this.parseBaseProps(u,{title:e.title}),p=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(`deployment`,this.docUri,n,r.deployment,i.deployment),source:r,target:i,...f,metadata:l,kind:s,tags:a,links:o,...toRelationshipStyle(p?.props,t),navigateTo:d,astPath:n})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;invariant(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+stringHash(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(E(n,O(isViewStringProperty),c(e=>[e.key,e.value]))),s=this.convertTags(t),l=this.convertLinks(t);return Al.writeId(e,i),{[Li]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:isNonEmptyArray(l)?l: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=[],n=e.expr;for(;n;){try{let e=n.value;o(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),n=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const parseMetadataEquals=({operator:e,not:t},n)=>e?.startsWith(`!=`)?{neq:n}:e?.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n},parseEquals=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};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,n=parseParticipant(e);invariant(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case isWhereKindEqual(e):{let t=e.value?.ref?.name,n=parseParticipant(e);invariant(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case isWhereMetadataEqual(e):{let t=e.key,n=parseParticipant(e);invariant(t,`Expected metadata key`);let r={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return n?{participant:n,operator:r}:r}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:nonexhaustive(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[isAndOperator(t)?t.and:t,isAndOperator(n)?n.and:n].flat();return invariant(isNonEmptyArray(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[isOrOperator(t)?t.or:t,isOrOperator(n)?n.or:n].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 n=importsRef(e);if(n){let e={project:projectIdFrom(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=instanceRef(e);return r?{deployment:this.resolveFqn(r),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 n=t.value.view.$refText;return _(n)&&(e.custom.navigateTo=n),e}if(isNotesProperty(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(parseMarkdownAsString(t.value));return n&&(e.custom[t.key]=n),e}if(isIconProperty(t)){let n=this.parseIconProperty(t);return C(n)&&(e.custom[t.key]=n),e}if(isColorProperty(t)){let n=toColor(t);return C(n)&&(e.custom[t.key]=n),e}if(isShapeProperty(t)||isBorderProperty(t))return C(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return C(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let n=toColor(t);return C(n)&&(e.custom[t.key]=n),e}if(isNotationProperty(t)){let n=_(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(isMultipleProperty(t))return d(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return _(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return _(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=[],n=e;for(;n;){try{o(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(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 n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(parseMarkdownAsString(t.value));return n&&(e[t.key]=n),e}if(isArrowProperty(t))return _(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let n=toColor(t);return _(n)&&(e[t.key]=n),e}if(isLineProperty(t))return _(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let n=t.value.view.ref?.name;return _(n)&&(e[t.key]=n),e}if(isMultipleProperty(t))return d(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),n=t.where?.expr??t,r=t.where?.condition,i=e.where?parseWhereClause(e.where):null,a;return a=i&&r?createBinaryOperator(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default: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,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!_(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!_(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);D(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(isGlobalPredicateGroup(e)){let r=this.parseGlobalPredicateGroup(e);D(r,1)&&(n.predicates[t]=r);return}if(isGlobalDynamicPredicateGroup(e)){let r=this.parseGlobalDynamicPredicateGroup(e);D(r,1)&&(n.dynamicPredicates[t]=r);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,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(nonNullable(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*streamModel(e){let t=Qe.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(isRelation(r)){n.push(r);continue}if(isExtendRelation(r)){n.push(r);continue}if(r.body?.elements&&D(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}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 n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(isExtendRelation(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}nonexhaustive(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=nonNullable(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.getAstNodePath(e),[l,u,d]=e.props??[],f=E(e.body?.props??[],O(t),O(isElementStringProperty),c(e=>[e.key,e.value])),{title:p,...m}=this.parseBaseProps(f,{title:l,summary:u,technology:d});return exact({id:n,kind:r,astPath:s,title:p,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...m,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(isMetadataProperty)),r=this.parseLinks(e.body);if(!t&&f(n)&&!r)return null;let i=this.getAstNodePath(e);return exact({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);invariant(W.isModelRef(t)||W.isImportRef(t),`Source must be a model reference`),invariant(W.isModelRef(n)||W.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(isMetadataProperty)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&S(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return exact({id:stringHash(`extend-relation`,W.flatten(t),W.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(C(e.source)){let t=this.parseFqnRef(e.source);return invariant(W.isModelRef(t)||W.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,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);invariant(W.isModelRef(r)||W.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(isMetadataProperty)),l=this.getAstNodePath(e),u=E(e.body?.props??[],O(isRelationStringProperty),O(e=>_(e.value)),c(e=>[e.key,e.value])),d=E(e.body?.props??[],O(isRelationNavigateToProperty),y(e=>e.value.view.ref?.name),O(_),Pe()),{title:f=``,description:p,technology:m}=this.parseBaseProps(u,{title:e.title,description:e.description,technology:e.technology}),h=e.body?.props.find(isRelationStyleProperty);return exact({id:stringHash(this.docUri,l,W.flatten(n),W.flatten(r)),astPath:l,source:n,target:r,title:f,metadata:s,kind:o,tags:i,links:a,navigateTo:d,description:p,technology:m,...toRelationshipStyle(h?.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,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!_(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=E(n.filter(isSpecificationRelationshipStringProperty)??[],O(e=>this.isValid(e)&&o(e.value)),c(e=>[e.key,removeIndent(parseMarkdownAsString(e.value))]),He(b)),a=n.filter(isMultipleProperty);a.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${r}", using the first one`,e,`specification`);let s=a[0];t.relationships[r]={...i,...toRelationshipStyle(n.filter(isRelationshipStyleProperty),this.isValid),...s&&{multiple:s.value}}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}_(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:nonNullable(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!_(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(isElementStyleProperty)),o=this.parseLinks(e),s=E(n.filter(isSpecificationElementStringProperty)??[],O(e=>this.isValid(e)),c(e=>[e.key,e.value])),l=this.parseBaseProps(s),u=removeIndent(parseMarkdownAsString(s.notation));return{[r]:exact({...l,notation:u,tags:i??void 0,...o&&isNonEmptyArray(o)&&{links:o},style:a})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!S(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case isElementView(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case isDynamicView(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case isDeploymentView(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:nonexhaustive(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;invariant(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=elementRef(e.viewOf),n=t&&safeCall(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+stringHash(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(E(n.props,O(e=>this.isValid(e)),O(isViewStringProperty),c(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n),d={[Li]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:l,links:isNonEmptyArray(u)?u:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(Al.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return invariant(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}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=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);nonexhaustive(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(isViewRulePredicate(n)){t.push(this.parseViewRulePredicate(n));continue}if(isViewRuleGroup(n)){t.push(this.parseViewRuleGroup(n));continue}nonexhaustive(n)}catch(e){this.logError(e,n,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Hi.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Hi.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;invariant(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+stringHash(this.doc.uri.toString(),a);let{title:s=null,description:l=null}=this.parseBaseProps(E(i,O(isViewStringProperty),c(e=>[e.key,e.value]))),u=this.convertTags(n),d=this.convertLinks(n);Al.writeId(e,o);let f=ce(i,isDynamicViewDisplayVariantProperty)?.value;return{[Li]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:l,tags:u,links:isNonEmptyArray(d)?d:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.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=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(isFqnExprOrWith(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=pathInsideDynamicView(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return invariant(isNonEmptyArray(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}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 n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!isNonEmptyArray(n)||!this.isValid(e))return[];let r=Ce(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=elementRef(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=elementRef(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:pathInsideDynamicView(e)},r=removeIndent(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;_(e)&&(n.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(C(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(parseMarkdownAsString(t.value))??``;break;case isNotesProperty(t):C(t.value)&&(n[t.key]=removeIndent(t.value));break;case isArrowProperty(t):C(t.value)&&(n[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);C(e)&&(n[t.key]=e);break}case isLineProperty(t):C(t.value)&&(n[t.key]=t.value);break;case isMultipleProperty(t):break;default:nonexhaustive(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!isDynamicViewBody(t);)g(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}Xn();const od=E(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends od{};const sd=J.getChild(`parser`),isError=e=>e.severity===Jn.Error;var LikeC4ModelParser=class{services;cachedParsers=new Xe.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(N.Linked,async e=>{this.cachedParsers.has(e)&&(sd.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:F.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(N.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(N.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(sd.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:F.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),n=F.relative(t.folderUri,e.uri);e.likec4ProjectId?sd.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):sd.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<N.Linked&&sd.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new Je.default(Set)};e=Object.assign(e,r);let i=new DocumentParser(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},LikeC4ValueConverter=class extends tr{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ht.convertString(t)):super.runConverter(e,t,n)}};Xn();const{findNodeForKeyword:cd}=Bn,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...Ie(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!isViewRuleStyle(n)&&!isDeploymentViewRuleStyle(n))return!1;let r=n.targets.value;if(!r||_(n.targets.prev)||r.$type!==`FqnRefExpr`||_(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function changeElementStyle(e,{view:t,viewAst:n,targets:r,style:i}){invariant(n.body,`View ${t.id} has no body`);let a=n.$cstNode;invariant(a,`viewCstNode`);let o=Ce(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;invariant(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=O(n.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),u=t._type===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=xe(l,isMatchingViewRule(e,c)),n=u&&isAncestor(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},includeRange=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},m=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>asViewStyleRule(e,i,s));m.push(fn.insert(o,`
|
|
83
98
|
`+e.join(`
|
|
84
|
-
`))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Ce(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;invariant(t,`RuleCstNode not found`);for(let[n,r]of
|
|
85
|
-
`+c)),includeRange({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:m}}Ln();const{findNodeForKeyword:Nu}=Jt;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){invariant(n.body,`View ${t.id} has no body`);let i=n.$cstNode;invariant(i,`viewCstNode`);let a=toAstViewLayoutDirection(r.direction),o=Ie(n.body.rules,isViewRuleAutoLayout),s=`autoLayout ${a}`;if(p(r.rankSep)&&(s+=` ${r.rankSep}`,p(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Sn.replace(o.$cstNode.range,s);let c=Nu(n.body.$cstNode,`}`)?.range.start;invariant(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Sn.insert(c,l)}Ln();const Pu=K.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.workspace;try{let{viewId:n,projectId:r,change:i}=e,a=t.ProjectsManager.ensureProject(r);Pu.debug`Applying model change ${i.op} to view ${n} in project ${a.id}`;let o=this.locator.locateViewAst(n,a.id);if(!o)throw Error(`View ${n} not found in project ${a.id}`);let s={uri:o.doc.textDocument.uri,version:o.doc.textDocument.version};if(i.op===`save-view-snapshot`)return invariant(n===i.layout.id,`View ID does not match, expected `+n+`, got `+i.layout.id),{success:!0,location:await t.ManualLayouts.write(a,i.layout)};if(i.op===`reset-manual-layout`)return{success:!0,location:await t.ManualLayouts.remove(a,n)};let{edits:c,modifiedRange:l}=this.convertToTextEdit({lookup:o,change:i});return c.length?await this.applyTextEdits(o.doc,c)?{success:!0,location:{uri:s.uri,range:l}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let n=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return Pu.warn(n),{success:!1,error:n}}}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 n=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:nonexhaustive(t)}}async applyTextEdits(e,t){let n=this.services.shared.lsp.Connection,r=this.services.shared.workspace;if(!n){let n=En.applyEdits(e.textDocument,t);return await r.FileSystemProvider.writeFile(e.uri,n),!0}let i=await n.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return i.applied?(await r.DocumentBuilder.update([e.uri],[]),i.applied):(Pu.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${i.failureReason}`,n.window.showErrorMessage(`Failed to apply changes: ${i.failureReason}`),!1)}},LikeC4NameProvider=class extends Wt{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 D(e,oe(e=>`${e.type}.${e.name}`),je(),E(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends an{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){logWarnError(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(g(r)||r.length===0))for(let e of r)try{_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}exportGlobals(e,t,n){if(!(g(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}}exportModel(e,t,n){if(!(g(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{isElement(r)&&_(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){logWarnError(e)}}exportLibrary(e,t,n){if(!g(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){logWarnError(e)}}exportSpecification(e,t,n){if(!(g(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(r):case isSpecificationElementKind(r):_(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case isSpecificationTag(r):_(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case isSpecificationRelationshipKind(r):_(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case isSpecificationColor(r):_(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:nonexhaustive(r)}}catch(e){logWarnError(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(g(r)||r.length===0))for(let e of r)try{isDeploymentNode(e)&&_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new Gt;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){logWarnError(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){logWarnError(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new Gt,i=[];for(let a of e.elements){if(isRelation(a))continue;let e;if(isElement(a)?(_(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):isExtendElement(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){logWarnError(e)}}i.length&&D(i,w(e=>!r.has(e.name)),oe(e=>e.name),te((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new Gt,i=[];for(let a of e.elements){if(isDeploymentRelation(a))continue;let e=a.body;if(!isExtendDeployment(a)){let i=this.nameProvider.getName(a);if(_(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){logWarnError(e)}}i.length&&D(i,w(e=>!r.has(e.name)),oe(e=>e.name),te((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:Fu}=on;var LikeC4ScopeProvider=class extends qn{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),n=this.reflection.getReferenceType(e);try{let r=e.container;if(isFqnRef(r))return new Jn(this.streamForFqnRef(t,r,e));if(isStrictFqnRef(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==`Element`)return this.getProjectScope(t,n,e);if(isImported(r)){let e=projectIdFrom(r);return new Jn(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(r)&&e.property===`el`){let i=r.parent;return i?new Jn(this.fqnIndex.directChildrenOf(t,readStrictFqn(i))):this.getProjectScope(t,n,e)}return new Jn(ln(this.computeScope(t,e)))}catch(r){return logWarnError(r),this.getProjectScope(t,n,e)}}catch(e){return logWarnError(e),rn}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(isDeploymentNode(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(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,n){let r=t.parent;return r?new Jn(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(r)).filter(e=>this.reflection.isSubtype(e.type,Lo))):this.getProjectScope(e,Lo,n)}*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,n){let r=t.parent;if(!r)return ln(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return un;if(isImported(i))return ln(this.genUniqueDescedants(i.imported.ref));if(isDeploymentNode(i))return ln(this.genUniqueDescedants(i));if(isDeployedInstance(i)){let e=i.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return ln(this.genUniqueDescedants(t))}return isElement(i)?ln(this.genUniqueDescedants(i)):nonexhaustive(i)}*genScopeForParentlessFqnRef(e,t,n){Xt(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,n,es):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,n,es),yield*this.computeScope(e,n,Lo),yield*this.computeScope(e,n,Fo)):(yield*this.computeScope(e,n,Lo),yield*this.computeScope(e,n,Fo),Xt(t,isDeploymentViewBody)&&(yield*this.computeScope(e,n,es)));let r=Fu(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Fs)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,es),i=this.reflection.isSubtype(n,Ka),a=Fu(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),o=t.container;for(;o;){let e=a.get(o).filter(byReferenceType);e.length>0&&(yield*e),i&&isExtendDeploymentBody(o)&&(yield*this.genScopeExtendDeployment(o.$container)),r&&isExtendElementBody(o)&&(yield*this.genScopeExtendElement(o.$container)),r&&isElementViewBody(o)&&(yield*this.genScopeElementView(o.$container)),o=o.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===`LibIcon`?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new Ut(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let n=projectIdFrom(t.container);return this.getProjectScope(n,e,t)}},Z=jn();let Iu;(function(e){e.type=new Z.NotificationType(`likec4/onDidChangeModel`)})(Iu||={});let Lu;(function(e){e.type=new Z.NotificationType0(`likec4/onDidChangeProjects`)})(Lu||={});let Ru;(function(e){e.type=new Z.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(Ru||={});let zu;(function(e){e.type=new Z.NotificationType(`likec4/onRequestOpenView`)})(zu||={});let Bu;(function(e){e.req=new Z.RequestType(`likec4/fetchComputedModel`)})(Bu||={});let Vu;(function(e){e.req=new Z.RequestType0(`likec4/fetchViewsFromAllProjects`)})(Vu||={});let Hu;(function(e){e.req=new Z.RequestType(`likec4/fetchLayoutedModel`)})(Hu||={});let Uu;(function(e){e.req=new Z.RequestType(`likec4/layout-view`)})(Uu||={});let Wu;(function(e){e.req=new Z.RequestType(`likec4/validate-layout`)})(Wu||={});let Gu;(function(e){e.req=new Z.RequestType0(`likec4/reload-projects`)})(Gu||={});let Ku;(function(e){e.req=new Z.RequestType0(`likec4/fetch-projects`)})(Ku||={});let qu;(function(e){e.req=new Z.RequestType(`likec4/register-project`)})(qu||={});let Ju;(function(e){e.req=new Z.RequestType(`likec4/build`)})(Ju||={});let Yu;(function(e){e.req=new Z.RequestType(`likec4/locate`)})(Yu||={});let Xu;(function(e){e.req=new Z.RequestType(`likec4/change-view`)})(Xu||={});let Zu;(function(e){e.req=new Z.RequestType0(`likec4/metrics`)})(Zu||={});let Qu;(function(e){e.req=new Z.RequestType(`likec4/document-tags`)})(Qu||={});let $u;(function(e){e.req=new Z.RequestType0(`likec4/fetch-projects-overview`)})($u||={});const Q=K.getChild(`rpc`);var Rpc=class extends ADisposable{constructor(e){super(),this.services=e}init=s(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,sendDidChangeModelNotification=t=>{Q.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(Iu.type,{projectId:t}).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},o=ce(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}),s=ce(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Lu.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),c=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>o.call(e)),n.ProjectsManager.onProjectsUpdate(()=>s.call(1)),e.onRequest(Bu.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===Gi.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Ru.type,async e=>{let t=N.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};Q.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(Hu.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:h(i,e=>e.id)}}}),e.onRequest(Uu.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(Wu.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(Ku.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:l(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:y(e,e=>e.uri.toString())}})})),e.onRequest(Gu.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(qu.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(N.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Vu.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Zt(e);try{let n=await t.Views.computedViews(i,e);r.push(...D(n,y(e=>({id:e.id,title:e.title??e.id,projectId:i})),fe((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(Ju.req,async({docs:t},n)=>{let a=t.map(e=>N.parse(e)),isNotChanged=e=>!a.some(t=>M.equals(t,e)),o=r.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();Q.debug(`[ServerRpc] received request to build:
|
|
99
|
+
`))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Ce(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;invariant(t,`RuleCstNode not found`);for(let[n,r]of Ie(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;includeRange({start:e,end:t}),m.push(fn.replace({start:e,end:t},n+` `+i));continue}let o=cd(t,`{`)?.range.end;invariant(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(fn.insert(o,`
|
|
100
|
+
`+c)),includeRange({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:m}}Xn();const{findNodeForKeyword:ld}=Bn;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){invariant(n.body,`View ${t.id} has no body`);let i=n.$cstNode;invariant(i,`viewCstNode`);let a=toAstViewLayoutDirection(r.direction),o=xe(n.body.rules,isViewRuleAutoLayout),s=`autoLayout ${a}`;if(g(r.rankSep)&&(s+=` ${r.rankSep}`,g(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return fn.replace(o.$cstNode.range,s);let c=ld(n.body.$cstNode,`}`)?.range.start;invariant(c,`Closing brace not found`);let l=`\t${s}\n\t`;return fn.insert(c,l)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof Pn?e.contents.some(e=>hasContent(e)):!1}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof Dn?!e.ifNotEmpty:e instanceof Pn?e.contents.some(e=>hasContentOrNewLine(e)):!1}function fresh(e){return{ctx:e??void 0,out:new Pn}}function materialize(e,t=2){return pn(re(e)?executeOnFresh(void 0,[e]).out:e.out,t).replaceAll(/\r\n/g,`
|
|
101
|
+
`)}function executeOnCtx(e,t,...n){h(t)?(invariant(n.length===0,`When first argument is an array, no additional operations are allowed`),n=t):n=[t,...n];for(let t of n)e=t(e);return e}function executeOnFresh(e,t,...n){return h(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...n])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let n=typeof e==`function`?e:t,wrapped=e=>{let t=n(e);return t instanceof Pn?{...e,out:t}:e};return typeof e==`string`&&n.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:n}){let r=typeof e==`function`?e(t):e??t;b(r)||r===``||(invariant(isPrintable(r),`Value must be a string, number or boolean - got `+typeof r),n.append(String(r)))})}function noop(){return m()}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:n}){let r=executeOnFresh(t,e);n.appendIf(hasContent(r.out),r.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=Lr(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[Gn(t.split(/\r?\n/),{separator:Vn})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:n}){let r=executeOnFresh(e,t);hasContent(r.out)&&n.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:r.out.contents}).appendNewLineIfNotEmpty()})}function inlineText(e){return operation(({ctx:t,out:n})=>{let r=e??t;if(b(r))return;invariant(v(r),`Value must be a string - got `+typeof r);let i=r.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();n.append(`'${i}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:n}){let r=typeof e==`function`?e(t):e??t;if(!b(r))return invariant(v(r),`Value must be a string - got `+typeof r),r.includes(`
|
|
102
|
+
`)?multilineText(r)({ctx:r,out:n}):inlineText()({ctx:r,out:n})})}const ud=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let n=e??t.ctx;if(!b(n))return invariant(v(n),`Value must be a string - got `+typeof n),multilineText(n,ud)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let n=e??t.ctx;if(!b(n)){if(typeof n==`string`)return text(n)(t);if(`md`in n)return markdown(n.md)(t);if(`txt`in n)return multilineText(n.txt)(t);throw Error(`Invalid MarkdownOrString value: `+n)}})}t(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:n}){let{operations:r,...i}=e,a=Array.isArray(r)?r:[r];invariant(D(a,1),`At least one operation is required`);let o;return o=a.length===1?a[0](fresh(t)).out.contents:E(eachOnFresh(t,a),y(e=>e.out)),o=O(o,hasContentOrNewLine),n.appendIf(o.length>0,Gn(o,i))})}t(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,n)=>!n&&hasContent(e)?` `:void 0})}function lines(...e){let t=x(e);if(g(t)){let e=fresh(void 0);for(let n=0;n<t;n++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,n,r)=>r?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:n}){executeOnCtx({ctx:t,out:n},e)});let n=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},n)})}function property(e,t){return operation(function propertyOp({ctx:n,out:r}){let i=p(n)&&hasProp(n,e)?n[e]:void 0;if(i!=null){if(!t){invariant(isPrintable(i),`Property ${e} is not printable "${i}"`),r.append(e,` `,String(i));return}t({ctx:i,out:r})}})}function execToOut(e){return(t,...n)=>executeOnCtx({ctx:t,out:e},n)}function zodOp(e){return t=>()=>({ctx:n,out:r})=>{let i=vr(e,n);if(i.success){let e=t({ctx:i.data,out:r,exec:execToOut(r)});return e instanceof Pn?{ctx:n,out:e}:typeof e==`function`?{ctx:n,out:r,...e({ctx:n,out:r})}:{ctx:n,out:r}}throw i.error}}R().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),R().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),R().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e);const dd=dr().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),fd=mr(ji),pd=R().nonempty(`Icon cannot be empty`).transform(e=>e),md=mr(Ai),hd=mr(Oi),gd=mr(ki);mr(Xi),mr([`dashed`,`solid`,`dotted`]);const _d=rr(lr([R(),or({title:R().optional(),url:R()})]).transform(e=>exact(typeof e==`string`?{url:e}:e))).readonly(),vd=mr(Mi),yd=_r().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e),bd=rr(R().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e)).readonly(),xd=lr([R(),hr({md:R()}),hr({txt:R()})]).transform(e=>typeof e==`string`?{txt:e}:e),Sd=vd.or(yd),Cd=or({shape:fd,icon:pd,iconColor:Sd,iconSize:hd,iconPosition:gd,color:Sd,border:md,opacity:dd,size:hd,padding:hd,textSize:hd,multiple:sr()}).partial(),wd=lr([R(),sr(),cr()]),Td=fr(R(),wd.or(rr(wd)));or({tags:bd.nullable(),title:R(),summary:xd.nullable(),description:xd.nullable(),notation:R().nullable(),technology:R().nullable(),links:_d.nullable(),metadata:Td}).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(Cd)(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,n){return materialize(withctx(t??{},e),n?.indentation)}function preparePayload(e,t){let n=t.shared.workspace,{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i),s=t.likec4.ModelLocator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);return{viewId:r,change:a,services:t,project:o,doc:s.doc,viewAst:s.viewAst,workspace:n}}function viewChangeHandler(e,t){return n=>{if(n.change.op===e)return t(n)}}const Ed=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:n,description:r}=e,i=[];return n!==void 0&&i.push(updateViewTitle(t,n)),r!==void 0&&i.push(...updateViewDescription(t,r)),e.tag!==void 0&&i.push(...updateViewTags(t,e.tag)),i});function findExistingViewProperty(e,t){let n=e.body?.props;if(!(!n||!D(n,1)))return xe(n,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let n=t(nonNullable(e.body,`View body is required`));if(!n)return Zl.Position.create(0,0);let{line:r,character:i}=n;return Zl.Position.create(r,i+1)}const doubleIndent=e=>Be(newline(),indent(indent(e)));function updateViewTitle(e,t){let n=findExistingViewProperty(e,`title`),r=withctx({title:t})(titleProperty());return n?Zl.TextEdit.replace(n.$cstNode.range,printOperation(r)):Zl.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(r)).trimEnd())}function collectAllTagRefs(e){let t=[],n=e;for(;n;){let e=[];for(let t of n.values)t.$cstNode&&e.push(t);t.push(e),n=n.prev}return t.reverse().flat()}function addTag(e,t,n){let r=t.tags;return r?.$cstNode?Zl.TextEdit.insert(r.$cstNode.range.end,`, #${n}`):Zl.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(print(`#${n}`))).trimEnd())}function removeTag(e,t){let n=collectAllTagRefs(e.tags),r=n.findIndex(e=>e.tag.ref?.name===t);if(r<0)return;if(n.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return Zl.TextEdit.del({start:Zl.Position.create(e.line,0),end:Zl.Position.create(e.line+1,0)})}return}let i=n[r];if(r>0){let e=n[r-1];return Zl.TextEdit.del({start:e.$cstNode.range.end,end:i.$cstNode.range.end})}let a=n[r+1];return Zl.TextEdit.del({start:i.$cstNode.range.start,end:a.$cstNode.range.start})}function updateViewTags(e,t){let n=[],r=nonNullable(e.body,`View body is required`);if(t.add){let i=Array.isArray(t.add)?t.add:[t.add];for(let t of i)t&&n.push(addTag(e,r,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(r,t):void 0;e&&n.push(e)}}return n}function updateViewDescription(e,t){let n=findExistingViewProperty(e,`description`),r=withctx({description:t},indent(indent(descriptionProperty())));if(n)return[Zl.TextEdit.replace({start:{line:n.$cstNode.range.start.line,character:0},end:n.$cstNode.range.end},materialize(r).trimEnd())];let i=findInsertPosition(e,e=>E(e.props,y(e=>e.$cstNode?.range.end),O(_),Ce())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[Zl.TextEdit.insert({line:i.line+1,character:0},materialize(r))]}Xn();const Dd=J.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:n,change:r}=e;if(r.op===`change-property`){let t=preparePayload(e,this.services),n=Ed(t);if(!n)return{success:!1,error:`No changes to apply`};let r=Array.isArray(n)?n:[n];return await this.applyTextEdits(t.doc,r)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let i=this.services.shared.workspace;try{let e=i.ProjectsManager.ensureProject(n);Dd.debug`Applying model change ${r.op} to view ${t} in project ${e.id}`;let a=this.locator.locateViewAst(t,e.id);if(!a)throw Error(`View ${t} not found in project ${e.id}`);let o={uri:a.doc.textDocument.uri,version:a.doc.textDocument.version};if(r.op===`save-view-snapshot`)return invariant(t===r.layout.id,`View ID does not match, expected `+t+`, got `+r.layout.id),{success:!0,location:await i.ManualLayouts.write(e,r.layout)};if(r.op===`reset-manual-layout`)return{success:!0,location:await i.ManualLayouts.remove(e,t)};let{edits:s,modifiedRange:c}=this.convertToTextEdit({lookup:a,change:r});return s.length?await this.applyTextEdits(a.doc,s)?{success:!0,location:{uri:o.uri,range:c}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let n=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return Dd.warn(n),{success:!1,error:n}}}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 n=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:nonexhaustive(t)}}async applyTextEdits(e,t){let n=this.services.shared.lsp.Connection,r=this.services.shared.workspace;if(!n){let n=qt.applyEdits(e.textDocument,t);return await r.FileSystemProvider.writeFile(e.uri,n),await r.DocumentBuilder.update([e.uri],[]),!0}let i=await n.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return i.applied?(await r.DocumentBuilder.update([e.uri],[]),i.applied):(Dd.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${i.failureReason}`,n.window.showErrorMessage(`Failed to apply changes: ${i.failureReason}`),!1)}},LikeC4NameProvider=class extends Zt{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(Qt(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Qt(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 E(e,oe(e=>`${e.type}.${e.name}`),Ie(),k(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends Vt{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){logWarnError(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(b(r)||r.length===0))for(let e of r)try{_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}exportGlobals(e,t,n){if(!(b(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}}exportModel(e,t,n){if(!(b(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{isElement(r)&&_(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){logWarnError(e)}}exportLibrary(e,t,n){if(!b(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){logWarnError(e)}}exportSpecification(e,t,n){if(!(b(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(r):case isSpecificationElementKind(r):_(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case isSpecificationTag(r):_(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case isSpecificationRelationshipKind(r):_(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case isSpecificationColor(r):_(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:nonexhaustive(r)}}catch(e){logWarnError(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(b(r)||r.length===0))for(let e of r)try{isDeploymentNode(e)&&_(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new kn;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){logWarnError(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){logWarnError(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new kn,a=[];for(let i of e.elements){if(isRelation(i))continue;let e;if(isElement(i)?(_(i.name)&&r.add(i.name,this.descriptions.createDescription(i,i.name,n)),e=i.body,e&&(t.add(e,this.descriptions.createDescription(i,`this`,n)),t.add(e,this.descriptions.createDescription(i,`it`,n)))):isExtendElement(i)&&(e=i.body),e&&e.elements.length>0)try{a.push(...this.processContainer(e,t,n))}catch(e){logWarnError(e)}}a.length&&E(a,O(e=>!r.has(e.name)),oe(e=>e.name),i((e,t)=>{e.length===1&&r.add(t,e[0])}));let o=[...r.values()];return t.addAll(e,o),o}processDeployments(e,t,n){let r=new kn,a=[];for(let i of e.elements){if(isDeploymentRelation(i))continue;let e=i.body;if(!isExtendDeployment(i)){let a=this.nameProvider.getName(i);if(_(a)){let e=this.descriptions.createDescription(i,a,n);r.add(a,e)}e&&(t.add(e,this.descriptions.createDescription(i,`this`,n)),t.add(e,this.descriptions.createDescription(i,`it`,n)))}if(e)try{a.push(...this.processDeployments(e,t,n))}catch(e){logWarnError(e)}}a.length&&E(a,O(e=>!r.has(e.name)),oe(e=>e.name),i((e,t)=>{e.length===1&&r.add(t,e[0])}));let o=[...r.values()];return t.addAll(e,o),o}};const{getDocument:Od}=Jt;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),n=this.reflection.getReferenceType(e);try{let r=e.container;if(isFqnRef(r))return new An(this.streamForFqnRef(t,r,e));if(isStrictFqnRef(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==`Element`)return this.getProjectScope(t,n,e);if(isImported(r)){let e=projectIdFrom(r);return new An(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(r)&&e.property===`el`){let i=r.parent;return i?new An(this.fqnIndex.directChildrenOf(t,readStrictFqn(i))):this.getProjectScope(t,n,e)}return new An(Kn(this.computeScope(t,e)))}catch(r){return logWarnError(r),this.getProjectScope(t,n,e)}}catch(e){return logWarnError(e),Wt}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(isDeploymentNode(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(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,n){let r=t.parent;return r?new An(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(r)).filter(e=>this.reflection.isSubtype(e.type,cs))):this.getProjectScope(e,cs,n)}*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,n){let r=t.parent;if(!r)return Kn(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return bn;if(isImported(i))return Kn(this.genUniqueDescedants(i.imported.ref));if(isDeploymentNode(i))return Kn(this.genUniqueDescedants(i));if(isDeployedInstance(i)){let e=i.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return Kn(this.genUniqueDescedants(t))}return isElement(i)?Kn(this.genUniqueDescedants(i)):nonexhaustive(i)}*genScopeForParentlessFqnRef(e,t,n){un(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,n,Ts):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,n,Ts),yield*this.computeScope(e,n,cs),yield*this.computeScope(e,n,os)):(yield*this.computeScope(e,n,cs),yield*this.computeScope(e,n,os),un(t,isDeploymentViewBody)&&(yield*this.computeScope(e,n,Ts)));let r=Od(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,ac)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Ts),i=this.reflection.isSubtype(n,_o),a=Od(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),o=t.container;for(;o;){let e=a.get(o).filter(byReferenceType);e.length>0&&(yield*e),i&&isExtendDeploymentBody(o)&&(yield*this.genScopeExtendDeployment(o.$container)),r&&isExtendElementBody(o)&&(yield*this.genScopeExtendElement(o.$container)),r&&isElementViewBody(o)&&(yield*this.genScopeElementView(o.$container)),o=o.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===`LibIcon`?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new $t(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let n=projectIdFrom(t.container);return this.getProjectScope(n,e,t)}},kd=er();let Ad;(function(e){e.type=new kd.NotificationType(`likec4/onDidChangeModel`)})(Ad||={});let jd;(function(e){e.type=new kd.NotificationType0(`likec4/onDidChangeProjects`)})(jd||={});let Md;(function(e){e.type=new kd.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(Md||={});let Nd;(function(e){e.type=new kd.NotificationType(`likec4/onRequestOpenView`)})(Nd||={});let Pd;(function(e){e.req=new kd.RequestType(`likec4/fetchComputedModel`)})(Pd||={});let Fd;(function(e){e.req=new kd.RequestType0(`likec4/fetchViewsFromAllProjects`)})(Fd||={});let Id;(function(e){e.req=new kd.RequestType(`likec4/fetchLayoutedModel`)})(Id||={});let Ld;(function(e){e.req=new kd.RequestType(`likec4/layout-view`)})(Ld||={});let Rd;(function(e){e.req=new kd.RequestType(`likec4/validate-layout`)})(Rd||={});let zd;(function(e){e.req=new kd.RequestType0(`likec4/reload-projects`)})(zd||={});let Bd;(function(e){e.req=new kd.RequestType0(`likec4/fetch-projects`)})(Bd||={});let Vd;(function(e){e.req=new kd.RequestType(`likec4/register-project`)})(Vd||={});let Hd;(function(e){e.req=new kd.RequestType(`likec4/build`)})(Hd||={});let Ud;(function(e){e.req=new kd.RequestType(`likec4/locate`)})(Ud||={});let Wd;(function(e){e.req=new kd.RequestType(`likec4/change-view`)})(Wd||={});let Gd;(function(e){e.req=new kd.RequestType0(`likec4/metrics`)})(Gd||={});let Kd;(function(e){e.req=new kd.RequestType(`likec4/document-tags`)})(Kd||={});let qd;(function(e){e.req=new kd.RequestType0(`likec4/fetch-projects-overview`)})(qd||={});const Q=J.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=s(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,sendDidChangeModelNotification=t=>{Q.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(Ad.type,{projectId:t}).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},o=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}),s=te(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(jd.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),c=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>o.call(e)),n.ProjectsManager.onProjectsUpdate(()=>s.call(1)),e.onRequest(Pd.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===ha.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Md.type,async e=>{let t=P.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};Q.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(Id.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:Me(i,e=>e.id)}}}),e.onRequest(Ld.req,async({viewId:e,projectId:n,layoutType:r,hints:i},a)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,layoutHints:i,cancelToken:a})})),e.onRequest(Rd.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(Bd.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:l(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:y(e,e=>e.uri.toString())}})})),e.onRequest(zd.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Vd.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(P.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Fd.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Xt(e);try{let n=await t.Views.computedViews(i,e);r.push(...E(n,y(e=>({id:e.id,title:e.title??e.id,projectId:i})),fe((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(Hd.req,async({docs:t},n)=>{let a=t.map(e=>P.parse(e)),isNotChanged=e=>!a.some(t=>F.equals(t,e)),o=r.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();Q.debug(`[ServerRpc] received request to build:
|
|
86
103
|
changed (total ${a.length}):${t.map(e=>`
|
|
87
104
|
- `+e).join(``)}
|
|
88
105
|
deleted (total ${o.length}):${o.map(e=>`
|
|
89
106
|
- `+e.toString()).join(`
|
|
90
|
-
`)}`),!c&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),c=!1,await Zt(n),await i.update(a,o,n)}),e.onRequest(Yu.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:nonexhaustive(e)}}),e.onRequest(Xu.req,async e=>(Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Zu.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Gi.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=a(n.specification.elements).length,r.deploymentKinds+=a(n.specification.deployments).length,r.relationshipKinds+=a(n.specification.relationships).length,r.tags+=a(n.specification.tags).length,r.customColors+=a(n.specification.customColors??{}).length,r.elements+=a(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=a(n.$data.relations).length,r.views+=a(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Zt(e),{metrics:r}}),e.onRequest(Qu.req,async({documentUri:e},r)=>{let i=N.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest($u.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),wn.create(()=>{o.cancel()}));function reportLayoutDrift(e){return D(e,w(e=>!!e.hasLayoutDrift),y(e=>{let n=t.ModelLocator.locateView(e.id);return invariant(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:El.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(zu.type,e)}};Ln();var NodeKindProvider=class{constructor(e){this.services=e}getSymbolKind(e){let t=Wn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(es,hs,Lo,Fo,Fs):return yn.Constructor;case hasType(Js,Xs,Ys,Es,Sc):return yn.Namespace;case hasType(io):return yn.Class;case hasType(`Tag`,zs,Mo,Cc):return yn.EnumMember;case hasType(uc,bc):return yn.Event;case hasType(ns,zo,vc,_c):return yn.TypeParameter}return yn.Field}getCompletionItemKind(e){let t=Wn(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Mo):return P.Color;case hasType(es,Lo,Fo,hs,Fs):return P.Constructor;case hasType(Js,Xs,Ys,Es,Sc):return P.Module;case hasType(io):return P.Class;case hasType(`Tag`,zs,Mo,Cc):return P.EnumMember;case hasType(uc,bc):return P.Event;case hasType(ns,vc,zo,_c):return P.TypeParameter;default:return P.Reference}}},WorkspaceSymbolProvider=class extends Pn{};const ed=K.getChild(`views`);var DefaultLikeC4Views=class{#e;#t=new O.default(e=>new ProjectStorage({projectId:e,storage:br(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=xr(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{ed.info`force clean cache`,this.#e.clear()})}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 n=Fe(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=ed.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(c.length>0&&(o.length>0?i.trace`cached ${c.length} views, need to layout ${o.length} views`:i.trace`cached all ${c.length} views`),o.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.debug`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Zt(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=ed.getChild(n);if(!a){o.warn`view ${e} not found in model`;let t=i.findManualLayout(e);if(t){o.info`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let s=this.projectStorage(n);try{let e={view:a,styles:i.$styles},n=await s.getOrExecute(e);return _(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=loggable(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Fe(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):logWarnError(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){ed.trace`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=computeAdhocView(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return ed.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e._layout===`manual`?(ed.error`View ${e.id} already has manual layout, this should not happen`,e):applyManualLayout(e,r):calcDriftsFromSnapshot(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=ed.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n)}async getOrExecute(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);this.#e.trace`cache miss for ${e.view.id}`;let r=performanceMark(),i=await this.#n(e);return this.#e.debug(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#t.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=cacheKey(e);return t&&(this.#t.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#t.has(n).then(e=>{e||(this.#t.set(n,`true`),t())})}resetViewError(e){this.#t.del(`error-${e.id}`)}};function cacheKey(e){return`${e.view.hash}-${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:applyCachedLayout(e,t.diagram)}}const td={graphviz(){return new Bi}};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 Yn(e,j.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new fl(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,n,r){let i=createSharedServices(e),a=fn([Tn({shared:i}),rl,createLikeC4Module({...Cl,...wl,...td,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?onNextTick(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...Cl,...wl,...e};return fn(pn(t),nl,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[n,r]of Object.entries(t)){if(n===`__proto__`||n===`constructor`||n===`prototype`||r===void 0)continue;let t=Object.hasOwn(e,n),i=e[n];t&&i!==null&&r!==null&&typeof i==`object`&&typeof r==`object`?e[n]=_merge(i,r):e[n]=r}return e}const isErrorDiagnostic=e=>e.severity===1;var LikeC4=class{langium;logger;constructor(e,t=G){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:
|
|
107
|
+
`)}`),!c&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),c=!1,await Xt(n),await i.update(a,o,n)}),e.onRequest(Ud.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:nonexhaustive(e)}}),e.onRequest(Wd.req,async e=>(Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Gd.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===ha.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=a(n.specification.elements).length,r.deploymentKinds+=a(n.specification.deployments).length,r.relationshipKinds+=a(n.specification.relationships).length,r.tags+=a(n.specification.tags).length,r.customColors+=a(n.specification.customColors??{}).length,r.elements+=a(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=a(n.$data.relations).length,r.views+=a(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Xt(e),{metrics:r}}),e.onRequest(Kd.req,async({documentUri:e},r)=>{let i=P.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(qd.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),hn.create(()=>{o.cancel()}));function reportLayoutDrift(e){return E(e,O(e=>!!e.hasLayoutDrift),y(e=>{let n=t.ModelLocator.locateView(e.id);return invariant(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Zl.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(Nd.type,e)}};Xn();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=Ln(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Ts,zs,cs,os,ac):return wn.Constructor;case hasType(vc,bc,yc,Xs,Kc):return wn.Namespace;case hasType(ko):return wn.Struct;case hasType(`Tag`,lc,ns,qc):return wn.EnumMember;case hasType(Pc,Wc):return wn.Event;case hasType(Ds,us,Hc,Vc):return wn.TypeParameter}return wn.Field}getCompletionItemKind(e){let t=Ln(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ns):return I.Color;case hasType(Ts,cs,os,zs,ac):return I.Constructor;case hasType(vc,bc,yc,Xs,Kc):return I.Module;case hasType(ko):return I.Class;case hasType(`Tag`,lc,ns,qc):return I.EnumMember;case hasType(Pc,Wc):return I.Event;case hasType(Ds,Hc,us,Vc):return I.TypeParameter;default:return I.Reference}}},WorkspaceSymbolProvider=class extends vn{};const Jd=J.getChild(`views`);var DefaultLikeC4Views=class{services;#e;#t=new A.default(e=>new ProjectStorage({projectId:e,storage:Rr(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=zr(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Jd.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 Ne((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ne(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=Jd.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(c.length>0&&(o.length>0?i.trace`cached ${c.length} views, need to layout ${o.length} views`:i.trace`cached all ${c.length} views`),o.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.debug`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Xt(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r,layoutHints:i}){let a=await this.ModelBuilder.computeModel(n,r),o=a.findView(e)?.$view;n=a.project.id;let s=Jd.getChild(n);if(i){invariant(o,`View ${e} not found in model`),s.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:n}=await this.layouter.aiLayout({view:o,styles:a.$styles},i);return{dot:t,diagram:n}}if(!o){s.warn`view ${e} not found in model`;let t=a.findManualLayout(e);if(t){s.info`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let c=this.projectStorage(n);try{let e={view:o,styles:a.$styles},n=await c.getOrExecute(e);return _(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,a,t)}:n}catch(e){let t=loggable(e);return s.warn(t),this.reportViewError(o,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Ne(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):logWarnError(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Jd.trace`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=computeAdhocView(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Jd.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e._layout===`manual`?(Jd.error`View ${e.id} already has manual layout, this should not happen`,e):applyManualLayout(e,r):calcDriftsFromSnapshot(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=Jd.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),n=await this.#t.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);this.#e.trace`cache miss for ${e.view.id}`;let r=performanceMark(),i=await this.#n(e);return this.#e.trace(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#t.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=cacheKey(e);return t&&(this.#t.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error:${e.id}`;this.#t.has(n).then(e=>{e||(this.#t.set(n,`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 Yd={graphviz(){return new ua}};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,N.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new Ll(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,n,r){let i=createSharedServices(e),a=rn([jn({shared:i}),Ol,createLikeC4Module({...Jl,...Yl,...Yd,...e}),t,n,r].reduce(_merge,{}));return i.ServiceRegistry.register(a),registerValidationChecks(a),e.connection?onNextTick(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...Jl,...Yl,...e};return rn(qn(t),Dl,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[n,r]of Object.entries(t)){if(n===`__proto__`||n===`constructor`||n===`prototype`||r===void 0)continue;let t=Object.hasOwn(e,n),i=e[n];t&&i!==null&&r!==null&&typeof i==`object`&&typeof r==`object`?e[n]=_merge(i,r):e[n]=r}return e}const isErrorDiagnostic=e=>e.severity===1;var LikeC4=class{langium;logger;constructor(e,t=ea){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:
|
|
91
108
|
${e.map(e=>` - ${e.folder.fsPath}`).join(`
|
|
92
109
|
`)}
|
|
93
110
|
|
|
94
|
-
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 y(this.languageServices.projects(),
|
|
95
|
-
`);return n.length>5&&(n.length=5,n.push(`...`)),n.map((e,n)=>n===0?` `+
|
|
96
|
-
`));this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async format(e){let{projects:t,...n}=e??{},r={...n,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(r)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const
|
|
97
|
-
`)}`);async function handleInitOptions(e,t=
|
|
111
|
+
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 y(this.languageServices.projects(),w(`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:n})=>({message:t,line:n.start.line,range:n,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 n=t.diagnostics?.filter(isErrorDiagnostic)??[];if(!D(n,1))continue;e=!0;let r=E(n,k(e=>{let t=e.range.start.line,n=e.message.split(`
|
|
112
|
+
`);return n.length>5&&(n.length=5,n.push(`...`)),n.map((e,n)=>n===0?` `+Br.dim(`Line ${t}: `)+Br.red(e):` `.repeat(10)+Br.red(e))}),Se(`
|
|
113
|
+
`));this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async format(e){let{projects:t,...n}=e??{},r={...n,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(r)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Xd={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(`
|
|
114
|
+
`)}`);async function handleInitOptions(e,t=ea,n){let r=new LikeC4(e,t);return(n?.throwIfInvalid??Xd.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(validationErrorsToError(r))):((n?.printErrors??Xd.printErrors)&&r.hasErrors()&&r.printErrors(),r)}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:pi,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=ea.getChild(`lang`),n=nt(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),r=n.graphviz===`binary`;return t.info(`${Br.dim(`layout`)} ${r?`binary`:`wasm`}`),createLanguageServices$1({...n.useFileSystem?{...WithFileSystem(n.watch),...n.manualLayouts?Ul:Yl}:{...Jl,...Yl},...WithGraphviz(r?new GraphvizBinaryAdapter:new ua)})}async function fromWorkspace(e,t){let n=ii(e),r=Nr(P.file(n).toString()),i=ea.getChild(`lang`),a=nt(t,{...Xd,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(a);let o=createLanguageServices(a),s={name:ti(n),uri:r},c=o.shared.workspace.WorkspaceManager;i.info(`${Br.dim(`workspace:`)} ${n}`),c.initialize({capabilities:{},processId:null,rootUri:s.uri,workspaceFolders:[s]}),await c.initialized({});let l=o.shared.workspace.LangiumDocuments.userDocuments.toArray();if(l.length===0&&(i.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw Error(`no LikeC4 sources found`);return i.info(`${Br.dim(`workspace:`)} found ${l.length} source files`),handleInitOptions(o,ea,t)}const Zd=Vr(),Qd=Vr();function useLanguageServices(){return Qd.use()}function setMcpServerCtx(e){return e?Zd.set(e,!0):Zd.unset(),e}function setLanguageServicesCtx(e){return e?Qd.set(e,!0):Qd.unset(),e}const $=ea.getChild(`mcp`);function likec4Tool(e){return t=>n=>{let{name:r,description:i,...a}=e,o={description:i?.trim()??``,...a};return n.registerTool(r,o,async(...e)=>{let n=useLanguageServices();$.debug(`Calling tool {name}, args: {args}`,{name:r,args:e});try{let r=await t.apply(null,[n,...e]);return typeof r==`string`?{content:[{type:`text`,text:r}]}:f(o.outputSchema)?hasProp(r,`content`)?r:{content:[{type:`text`,text:JSON.stringify(r)}]}:{content:[],structuredContent:r}}catch(e){return $.error(`Tool ${r} failed`,{err:e}),{content:[{type:`text`,text:loggable(e)}],isError:!0}}}),n}}var $d=`1.57.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(z().describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(w(`id`))),viewId:Xr(z().describe(`View ID`),async(n=``,r)=>{let i=r?.arguments?.projectId??t.projectsManager.default.id,a=await t.computedModel(i);return a?Array.from(a.views()).filter(e=>e.id.startsWith(n)).map(w(`id`)):(await e.sendLoggingMessage({level:`warning`,data:`Completing viewId for project ${i} with input value "${n}", model not found`}),[])})}},async({viewId:e,projectId:t},n)=>({messages:[{role:`user`,content:{type:`text`,text:["Call `apply-semantic-layout` tool from `likec4` MCP with these arguments:","projectId: `"+t+"`","viewId: `"+e+"`"].join(`
|
|
115
|
+
`)}}]})),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(w(`id`));let n=e.toLowerCase();return t.projects().filter(e=>e.id.toLowerCase().includes(n)).map(w(`id`))}}}),{description:`LikeC4 project resource`,mimeType:`application/json`},async(e,{projectId:n})=>{if(!n)return{contents:[]};let r=typeof n==`string`?[n]:n;return{contents:t.projects().filter(e=>r.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 ef=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[n,r]of e.entries())t[r]=n;return t}function edgeLabel(e){let t=e.label&&e.label!==`[...]`?e.label:void 0,n=flattenMarkdownOrString(e.description);return n&&(t=t?`${t}\n${n}`:n),t??=e.technology??void 0,t?truncate(t):void 0}function prepareLLMInput(e){let t=1,n=1,r=new A.default(e=>e.children.length===0?`n${n++}`:`c${t++}`),findNodeById=t=>e.nodes.find(e=>e.id===t),nodeId=e=>r.get(findNodeById(e)),i=new Set;e.nodes.forEach(e=>{r.get(e),e.children.length===0&&i.add(e.id)});let a=e.edges.find(e=>!i.has(e.source)||!i.has(e.target));if(a)throw ef.error(`Non-leaf edge found in view`,{view:e.id,edge:{source:a.source,target:a.target}}),Error(`Non-leaf edge found in view, this is not supported by the current implementation`);let o=1,s=new A.default(e=>`e${o++}`),c=e.edges.map(e=>{let t=nodeId(e.source),n=nodeId(e.target),r=e.parent?nodeId(e.parent):null;e.dir===`back`&&([t,n]=[n,t]);let i=edgeLabel(e);return{id:s.get(e),...i&&{label:i},...r&&{parent:r},source:t,target:n}}),reduceNodes=(e,t)=>{let{level:n,kind:i,...a}=t,o=r.get(t),s=a.children.length>0,c=a.parent?nodeId(a.parent):void 0,l=truncate(a.title);if(s)return e.compounds.push(exact({id:o,title:l,parent:c,children:a.children.map(nodeId),level:n})),e;let u=a.description?truncate(flattenMarkdownOrString(a.description),200):void 0;return e.nodes.push(exact({id:o,kind:i,title:l,description:u,parent:c,level:n})),e};return{serialized:e.nodes.reduce(reduceNodes,{direction:e.autoLayout.direction,compounds:[],nodes:[],edges:c}),mapping:{nodes:mappedEntries(r),edges:mappedEntries(s)}}}const tf=ir([`TB`,`BT`,`LR`,`RL`]),nf=R().nonempty().brand(),rf=or({rank:ir([`same`,`source`,`sink`,`min`,`max`]),nodes:rr(nf)}),af={id:R().nonempty().brand(),weight:ar().int().min(0).max(20),minlen:ar().int().min(0).max(4)},of=or({source:nf,target:nf,weight:af.weight.optional(),minlen:af.minlen.optional()}),sf=or({direction:tf.optional(),ranks:rr(rf).default([]),edgeWeight:fr(af.id,af.weight).default({}),edgeMinlen:fr(af.id,af.minlen).default({}),reverseRank:rr(af.id).default([]),excludeFromRanking:rr(af.id).default([]),edgeOrder:rr(af.id).default([]),nodeOrder:rr(nf).default([]),invisibleEdges:rr(of).default([]),reasoning:R().default(``)}),cf=/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/;function extractJson(e){let t=cf.exec(e);if(t&&t[1])return t[1];let n=e.indexOf(`{`),r=e.lastIndexOf(`}`);return n!==-1&&r!==-1&&r>n?e.slice(n,r+1):e.trim()}function parseOutput(e,t){try{let n=extractJson(e),r=wa.default.parse(n),i=sf.safeParse(r);if(!i.success){ef.warn(`Failed to validate LLM response
|
|
116
|
+
`+yr(i.error));return}return restoreIdsAndMapToHints(i.data,t)}catch(t){ef.warn(`Failed to parse LLM response
|
|
117
|
+
{response}`,{error:t,response:e});return}}function restoreIdsAndMapToHints(e,t){let{mapping:n}=t,nodeId=e=>{let t=n.nodes[e]?.id;return t||ef.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>E(e,y(nodeId),O(C)),edgeId=e=>{let t=n.edges[e]?.id;return t||ef.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let n=e.map(t).filter(C);return D(n,1)?n:void 0},r=E(e.excludeFromRanking,y(edgeId),O(C),T(),e=>D(e,1)?e:void 0),i=E(e.reverseRank,y(edgeId),O(C),T(),e=>D(e,1)?e:void 0),a=(()=>{let e=new Set;return t=>t.filter(t=>e.has(t)?!1:(e.add(t),!0))})(),o=E(e.ranks,y(e=>{let t=a(mapToNodeId(e.nodes));return D(t,1)?{rank:e.rank,nodes:t}:null}),O(_)),s=E(e.invisibleEdges,y(({source:e,target:t,minlen:n=1,weight:r=1})=>{let i=nodeId(e),a=nodeId(t);if(!(!i||!a))return exact({weight:r===1?void 0:r,minlen:n===1?void 0:n,source:i,target:a})}),O(C),oe(e=>`${e.source}->${e.target}`),l(([e,...t])=>E(t,Ae((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))),Ne(),e=>D(e,1)?e:void 0),c=e.reasoning;c&&(c=c.replaceAll(`][`,`] [`),Ie(t.mapping.nodes).forEach(([e,t])=>{c=c.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.id+"`")}),Ie(t.mapping.edges).forEach(([e,t])=>{c=c.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.source+` -> `+t.target+"`")}));let safeMapEdgeKeys=e=>{let t={};for(let[n,r]of Ie(e)){let e=edgeId(n);e&&(t[e]=r)}return t};return exact({direction:e.direction,ranks:o,edgeWeight:safeMapEdgeKeys(e.edgeWeight),edgeMinlen:safeMapEdgeKeys(e.edgeMinlen),excludeFromRanking:r,reverseRank:i,edgeOrder:mapToNonEmpty(e.edgeOrder,edgeId),nodeOrder:mapToNonEmpty(e.nodeOrder,nodeId),invisibleEdges:s,reasoning:c})}const lf={systemPrompt:`You are an advisor specializing in software architecture diagrams and graphviz (DOT) layout optimizations.
|
|
118
|
+
You receive a JSON of Diagram data with:
|
|
119
|
+
- nodes (architectural elements, rendered as leaf boxes)
|
|
120
|
+
- compounds (group of nodes or other compounds, define hierarchy and rendered as boxes around children)
|
|
121
|
+
- edges (directed relationships between nodes, define flow from source to target)
|
|
122
|
+
- direction (preferred layout direction for the diagram, e.g. TB = top to bottom, LR = left to right)
|
|
123
|
+
|
|
124
|
+
Your task: Suggest layout hints to produce readable and visually balanced diagram.
|
|
125
|
+
|
|
126
|
+
<input>
|
|
127
|
+
Diagram (JSON object) fields:
|
|
128
|
+
- compounds: Compound[]
|
|
129
|
+
- nodes: Node[]
|
|
130
|
+
- edges: Edge[]
|
|
131
|
+
- direction: "TB" | "LR" | "BT" | "RL"
|
|
132
|
+
|
|
133
|
+
Node (JSON object) fields:
|
|
134
|
+
- id: string (starts with "n" followed by a number, e.g. "n1", "n2", etc.)
|
|
135
|
+
- kind: string (semantic type, e.g. "system", "container", "component", "service", "database", etc.)
|
|
136
|
+
- title: string
|
|
137
|
+
- description?: string | undefined - optional description
|
|
138
|
+
- parent?: string (compound ID) | undefined - optional Parent ID, if node is nested inside a compound;
|
|
139
|
+
- level: number - zero-based level in the hierarchy (root level = 0)
|
|
140
|
+
|
|
141
|
+
Compound (JSON object) fields:
|
|
142
|
+
- id: string (starts with "c" followed by a number, e.g. "c1", "c2", etc.)
|
|
143
|
+
- title: string
|
|
144
|
+
- parent?: string (compound ID) | undefined - optional Parent ID, if compound is nested inside another compound;
|
|
145
|
+
- level: number - zero-based level in the hierarchy (root level = 0)
|
|
146
|
+
- children: string[] - IDs of children (compounds or nodes)
|
|
147
|
+
|
|
148
|
+
Edge (JSON object) fields:
|
|
149
|
+
- id: string (starts with "e" followed by a number, e.g. "e1", "e2", etc.)
|
|
150
|
+
- source: string (node ID)
|
|
151
|
+
- target: string (node ID)
|
|
152
|
+
- parent?: string (compound ID) | undefined - optional Parent ID, if edge is inside a compound
|
|
153
|
+
- label?: string | undefined
|
|
154
|
+
</input>
|
|
155
|
+
|
|
156
|
+
<rules>
|
|
157
|
+
|
|
158
|
+
1. Diagram is a hierarchical directed graph, may contain cycles
|
|
159
|
+
2. Compound size and position are determined by its children; Node position is determined by its rank and hierarchy
|
|
160
|
+
3. In vertical direction (TB, BT) rank is a row, in horizontal (LR, RL) rank is a column; rank increases following the direction (i.e from top to bottom for TB)
|
|
161
|
+
4. Edge exists ONLY between nodes
|
|
162
|
+
5. Edge increases rank following its direction, i.e making rank of target higher than rank of source; \`minlen\` controls how many ranks apart they should be
|
|
163
|
+
- by default, all edges have \`minlen=1\`
|
|
164
|
+
- \`minlen=2\` adds extra rank between nodes, pushing target node further away from source (adds more space)
|
|
165
|
+
- \`minlen=0\` does not increase rank, but defines relative order within rank (i.e if rank is a row, source node is on the left, or if rank is a column, source node is on the top)
|
|
166
|
+
- keep \`minlen\` in range 0..4
|
|
167
|
+
6. You can change edge rank direction by adding its ID to the \`reverseRank\` array; this enforces the opposite - rank of source node should be higher than rank of target; It does not change the semantics, and gives more control over ranks. Especially useful to break cycles or swap rank order of source and target
|
|
168
|
+
7. You can exclude edge from calculations by adding its ID to the \`excludeFromRanking\` array; Edge still visible but does not contribute to node ranks (\`constraint=false\` in graphviz)
|
|
169
|
+
8. Edge acts like a "spring" that pulls nodes together; its force controlled by \`weight\`; higher weight means shorter and straighter line;
|
|
170
|
+
- by default, all edges have \`weight=1\`
|
|
171
|
+
- \`weight\` is relative to \`weight\` of other edges
|
|
172
|
+
- same \`weight\` value balances edges equally; only difference in \`weight\` values affects layout
|
|
173
|
+
- keep \`weight\` in range 1..10, to emphasize edge use range 6..10
|
|
174
|
+
9. You can add invisible edges to fine-tune node ranks (and/or order within same rank):
|
|
175
|
+
- invisible edge has same effects as regular edge (changes rank and order), but not visible and does not change semantics
|
|
176
|
+
- to add invisible edge, push an object with \`source\` and \`target\` node IDs to the \`invisibleEdges\` array (\`minlen\` and \`weight\` are optional, but if provided, follow the same rules)
|
|
177
|
+
- you can add edge if only there is no same edge exists, i.e if \`A->B\` exists, you can add \`B->A\`, but not \`A->B\` again
|
|
178
|
+
- invisible edges especially useful to pull semantically related nodes closer, force position of orphan nodes (having only incoming, outgoing, or none edges), move nodes to separate ranks or order nodes strictly in same rank
|
|
179
|
+
10. You can constrain node ranks by using the \`ranks\` array:
|
|
180
|
+
- \`rank="source"\` constrain node(s) at the minimum rank (top/left)
|
|
181
|
+
- \`rank="sink"\` constrain node(s) at the maximum rank (bottom/right)
|
|
182
|
+
- \`rank="same"\` constrain two or more nodes to be on the same rank
|
|
183
|
+
- Node cannot have multiple rank constraints, if you encounter this, pick the most important (prefer \`rank="same"\` when in doubt)
|
|
184
|
+
- Node rank constraint takes precedence over edge-based rank calculations
|
|
185
|
+
11. Vertical layout directions (TB,BT) are good for general flows (like interactions, processes, etc.), horizontal layout (LR,RL) for pipelines, request processing; Keep input layout direction, unless it contradicts the semantics
|
|
186
|
+
12. Node size is 300x200px, rank separation is 200px, spacing within rank is 200px
|
|
187
|
+
13. Avoid node overlapping, compounds order should be aligned with flows crossing their boundaries
|
|
188
|
+
14. Minimize edge crossings; prefer balanced, straighter edges
|
|
189
|
+
|
|
190
|
+
</rules>
|
|
191
|
+
|
|
192
|
+
<workflow>
|
|
193
|
+
|
|
194
|
+
1. Analyze diagram semantics, identify main and auxiliary flows, which nodes are most likely to be sources and which are sinks
|
|
195
|
+
2. If any compound exists, analyze hierarchy and keep parent-child relationships in mind as constraints
|
|
196
|
+
3. Plan node positions and rank constraints
|
|
197
|
+
4. Decide on edges: adjust \`minlen\`, reverse rank direction or exclude from ranking
|
|
198
|
+
5. Consider adding invisible edges to enforce layout
|
|
199
|
+
6. Balance the layout by adjusting edge weights
|
|
200
|
+
7. Output existing edges in semantic order
|
|
201
|
+
8. Output nodes in semantic order
|
|
202
|
+
</workflow>
|
|
203
|
+
|
|
204
|
+
<output>
|
|
205
|
+
Output ONLY a valid JSON object matching the following schema.
|
|
206
|
+
All fields are optional (omit empty, null, undefined).
|
|
207
|
+
Use \`reasoning\` field to explain your decision, be concise.
|
|
208
|
+
Do not include any other text, comments, questions or explanations.
|
|
209
|
+
Do not pretty-print, compact JSON is preferred.
|
|
210
|
+
|
|
211
|
+
\`\`\`json
|
|
212
|
+
{
|
|
213
|
+
// Force ranks for nodes, use "source" for top level, "sink" for bottom level, "same" for nodes that should be on the same rank
|
|
214
|
+
"ranks": [
|
|
215
|
+
{ "rank": "source", "nodes": ["n1", "n2"] },
|
|
216
|
+
{ "rank": "same", "nodes": ["n4", "n5"] },
|
|
217
|
+
{ "rank": "sink", "nodes": ["n3"] }
|
|
218
|
+
],
|
|
219
|
+
// Edge weight adjustments (only if you want to change from default weight=1)
|
|
220
|
+
"edgeWeight": {
|
|
221
|
+
"e1": 8,
|
|
222
|
+
"e2": 5
|
|
223
|
+
},
|
|
224
|
+
// Edge rank separation adjustments (only if you want to change from default minlen=1)
|
|
225
|
+
"edgeMinlen": {
|
|
226
|
+
"e1": 2, // two ranks between connected nodes
|
|
227
|
+
"e2": 0 // no rank separation
|
|
228
|
+
},
|
|
229
|
+
// Reverse edge rank
|
|
230
|
+
"reverseRank": ["e4"],
|
|
231
|
+
// Exclude edges from ranking
|
|
232
|
+
"excludeFromRanking": ["e5"],
|
|
233
|
+
// Add invisible edges to enforce better layout
|
|
234
|
+
"invisibleEdges": [
|
|
235
|
+
{
|
|
236
|
+
"source": "n1", // Node ID
|
|
237
|
+
"target": "n2", // Node ID
|
|
238
|
+
"weight": 8, // (optional, default: 1)
|
|
239
|
+
"minlen": 2 // (optional, default: 1)
|
|
240
|
+
}
|
|
241
|
+
],
|
|
242
|
+
// Suggest to change order of edges to satisfy semantics better (if order from input does not)
|
|
243
|
+
"edgeOrder": ["e2", "e1", "e3"],
|
|
244
|
+
// Suggest to change order of nodes to represent flows better (if order from input does not)
|
|
245
|
+
"nodeOrder": ["n2", "n1", "n3", "n4", "n5"],
|
|
246
|
+
// Suggest to change layout direction, if it would improve readability
|
|
247
|
+
"direction": "LR",
|
|
248
|
+
// Reasoning for debugging. Use ID in brackets, like [e1] or [n1], to reference nodes, compounds or edges (for invisible edges use [source->target]). This is important for displaying references on UI correctly.
|
|
249
|
+
"reasoning": "User-facing actor [n1] at top, data store [n3] at bottom. [n4] and [n2] on separate ranks to show the request flow clearly. Main flows are [e1][e2][e3] and [e4][e6], [e5] is auxiliary and does not affect ranking. Added invisible edge [n8->n9] to pull them closer and emphasize their connection."
|
|
250
|
+
}
|
|
251
|
+
\`\`\`
|
|
252
|
+
</output>
|
|
253
|
+
|
|
254
|
+
<example>
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
\`\`\`json
|
|
258
|
+
{
|
|
259
|
+
"direction": "TB",
|
|
260
|
+
"compounds": [
|
|
261
|
+
{ "id": "c1", "title": "Cloud System", "children": ["n2", "n3", "n4"], "level": 0 },
|
|
262
|
+
{ "id": "c2", "title": "Amazon", "children": ["n6", "n7", "n8"], "level": 0 }
|
|
263
|
+
],
|
|
264
|
+
"nodes": [
|
|
265
|
+
{ "id": "n2", "kind": "service", "title": "Cloud Legacy", "parent": "c1", "level": 1 },
|
|
266
|
+
{ "id": "n3", "kind": "service", "title": "Cloud Next", "parent": "c1", "level": 1 },
|
|
267
|
+
{ "id": "n4", "kind": "ui", "title": "Frontends", "parent": "c1", "level": 1 },
|
|
268
|
+
{ "id": "n6", "kind": "storage", "title": "S3", "parent": "c2", "level": 1 },
|
|
269
|
+
{ "id": "n7", "kind": "service", "title": "Lambda", "parent": "c2", "level": 1 },
|
|
270
|
+
{ "id": "n8", "kind": "storage", "title": "Postgres", "parent": "c2", "level": 1 }
|
|
271
|
+
],
|
|
272
|
+
"edges": [
|
|
273
|
+
{ "id": "e1", "source": "n7", "target": "n8", "parent": "c2"},
|
|
274
|
+
{ "id": "e2", "source": "n3", "target": "n7", "label": "calls lambda" },
|
|
275
|
+
{ "id": "e3", "source": "n4", "target": "n2", "parent": "c1", "label": "requests" },
|
|
276
|
+
{ "id": "e4", "source": "n3", "target": "n4", "parent": "c1", "label": "serves" },
|
|
277
|
+
{ "id": "e5", "source": "n3", "target": "n2", "parent": "c1", "label": "calls legacy" },
|
|
278
|
+
{ "id": "e6", "source": "n2", "target": "n6", "label": "persists" },
|
|
279
|
+
{ "id": "e7", "source": "n3", "target": "n8", "label": "reads users from the database" }
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
\`\`\`
|
|
283
|
+
|
|
284
|
+
OUTPUT:
|
|
285
|
+
\`\`\`json
|
|
286
|
+
{
|
|
287
|
+
"direction": "TB",
|
|
288
|
+
"ranks": [
|
|
289
|
+
{ "rank": "source", "nodes": ["n4"] },
|
|
290
|
+
{ "rank": "same", "nodes": ["n2", "n3"] },
|
|
291
|
+
{ "rank": "sink", "nodes": ["n6", "n8"] }
|
|
292
|
+
],
|
|
293
|
+
"edgeMinlen": {
|
|
294
|
+
"e5": 0
|
|
295
|
+
},
|
|
296
|
+
"reverseRank": ["e4"],
|
|
297
|
+
"excludeFromRanking": ["e1"],
|
|
298
|
+
"edgeOrder": ["e3", "e4", "e5", "e6", "e7", "e1"],
|
|
299
|
+
"nodeOrder": ["n4", "n2", "n3", "n6", "n7", "n8"],
|
|
300
|
+
"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"
|
|
301
|
+
}
|
|
302
|
+
\`\`\`
|
|
303
|
+
</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,n){try{ef.debug`generating AI layout hints for ${e.id} using ${t.name}`;let{serialized:r,mapping:i}=prepareLLMInput(e);return parseOutput(await t.sendRequest({...lf,view:e,mapping:i,diagram:JSON.stringify(r)},n),{mapping:i,view:e})}catch(e){ef.warn`AI layout enhancement failed: ${e}`;return}}const uf=H({name:z().describe(`Project identifier`),title:z().optional().describe(`Human-readable project title`),contactPerson:z().optional().describe(`Maintainer contact information`),metadata:Wr(z(),Kr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Yr([z(),B(z())]).optional().describe(`Style inheritance paths`),exclude:B(z()).optional().describe(`File exclusion patterns`),include:H({paths:B(z()).describe(`Include paths`),maxDepth:V().describe(`Maximum directory depth`),fileThreshold:V().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:H({outDir:z().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:H({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 df=H({id:z().describe(`Element id (FQN)`),name:z().describe(`Element name`),kind:z().describe(`Element kind`),title:z(),tags:B(z()),metadata:Wr(Yr([z(),B(z())])),includedInViews:B(H({id:z().describe(`View id`),title:z().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,n,r,i,a){invariant(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...serializeElement(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const ff=H({path:z().describe(`Path to the file`),range:H({start:H({line:V(),character:V()}),end:H({line:V(),character:V()})}).describe(`Range in the file`)}).nullable(),pf=z().refine(e=>!0).default(`default`).describe(`Project id (optional, will use "default" if not specified)`),mf=B(H({id:z().describe(`View id`),title:z().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)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:P.parse(r.uri).fsPath,range:r.range}:null}catch(e){return $.debug(`Failed to locate {params}`,{error:e,params:n}),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(z().default(`default`).describe(`Project id (optional, will use "default" if not specified)`),(e=``)=>t.projects().filter(t=>t.id.startsWith(e)).map(w(`id`))),viewId:Xr(z().describe(`View ID to apply semantic layout to`),async(e,n)=>{let r=n?.arguments?.projectId??t.projectsManager.default.id,i=await t.computedModel(r);if(!i)return[];let a=e??``;return Array.from(i.views()).filter(e=>e.id.startsWith(a)).map(w(`id`))})},outputSchema:{reasoning:z().describe(`Reasoning behind the layout changes`),snapshotUri:z().nullish().describe(`Where snapshot was saved (after applying layout)`)}},async(n,r)=>{let i=t.projectsManager.ensureProjectId(n.projectId);i!==n.projectId&&await e.sendLoggingMessage({level:`notice`,data:`Using project "${i}" instead of "${n.projectId}"`},r.sessionId);let a=await t.computedModel(i),o=a.findView(n.viewId);if(!o)return toolError(`View "${n.viewId}" not found in project "${i}"`);let s=await enhanceLayoutWithAI(o.$view,{name:`MCP`,async sendRequest({systemPrompt:e,userPrompt:t,diagram:n}){let i=await r.sendRequest({method:`sampling/createMessage`,params:{maxTokens:2e4,includeContext:`none`,systemPrompt:e,messages:[{role:`user`,content:{type:`text`,text:t+`
|
|
304
|
+
|
|
305
|
+
`+n}}]}},H({content:H({type:Ur(`text`),text:z()})}));return i.content.type===`text`?i.content.text:JSON.stringify(i.content)}},r.signal);if(!s)return await e.sendLoggingMessage({level:`error`,data:`Failed to generate layout hints`},r.sessionId),toolError(`Failed to generate layout hints`);await e.sendLoggingMessage({level:`info`,data:`Applying semantic layout...`},r.sessionId);let c=await t.views.layouter.aiLayout({view:o.$view,styles:a.$styles},s),l=await t.editor.applyChange({change:{op:`save-view-snapshot`,layout:c.diagram},viewId:o.id,projectId:i});return await e.sendLoggingMessage({level:`info`,data:`Layout applied successfully`},r.sessionId),{content:[],structuredContent:{reasoning:s.reasoning,...!!l.location&&{snapshotUri:l.location.uri.toString()}}}}),e}const hf=df.extend({description:z().nullable().describe(`Element description`),technology:z().nullable().describe(`Element technology`),shape:z().describe(`Rendered shape`),color:z().describe(`Rendered color`),children:B(z()).describe(`Direct child element ids`),incomingCount:V().describe(`Number of incoming relationships`),outgoingCount:V().describe(`Number of outgoing relationships`)}),gf=likec4Tool({name:`batch-read-elements`,description:`
|
|
98
306
|
Read details of multiple elements in a single call, reducing round-trips.
|
|
99
307
|
Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
|
|
100
308
|
|
|
@@ -156,7 +364,7 @@ Example response:
|
|
|
156
364
|
],
|
|
157
365
|
"notFound": []
|
|
158
366
|
}
|
|
159
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:
|
|
367
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:B(z()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:pf},outputSchema:{elements:B(hf),notFound:B(z()).describe(`Element ids that were not found`)}})(async(e,t)=>{invariant(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...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:i,notFound:a}}),_f=H({id:z(),kind:z(),title:z(),description:z().nullable(),technology:z().nullable(),shape:z(),color:z()}),vf=H({element1:_f,element2:_f,propertyDiffs:B(H({property:z().describe(`Property name`),element1Value:z().nullable().describe(`Value in element1`),element2Value:z().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:H({onlyInElement1:B(z()).describe(`Tags present only in element1`),onlyInElement2:B(z()).describe(`Tags present only in element2`),common:B(z()).describe(`Tags present in both elements`)}),metadata:H({onlyInElement1:Wr(Yr([z(),B(z())])).describe(`Metadata keys only in element1`),onlyInElement2:Wr(Yr([z(),B(z())])).describe(`Metadata keys only in element2`),different:B(H({key:z(),element1Value:Yr([z(),B(z())]),element2Value:Yr([z(),B(z())])})).describe(`Metadata keys present in both but with different values`),common:Wr(Yr([z(),B(z())])).describe(`Metadata keys with identical values in both`)}),relationships:H({incomingOnlyElement1:V().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:V().describe(`Count of unique source elements sending to element2 only`),incomingShared:V().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:V().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:V().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:V().describe(`Count of unique target elements receiving from both`)})}),yf=likec4Tool({name:`element-diff`,description:`
|
|
160
368
|
Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
|
|
161
369
|
|
|
162
370
|
Request:
|
|
@@ -216,7 +424,7 @@ Example response:
|
|
|
216
424
|
"outgoingShared": 2
|
|
217
425
|
}
|
|
218
426
|
}
|
|
219
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:z().describe(`First element id (FQN)`),element2Id:z().describe(`Second element id (FQN)`),project:
|
|
427
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:z().describe(`First element id (FQN)`),element2Id:z().describe(`Second element id (FQN)`),project:pf},outputSchema:vf.shape})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);invariant(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);invariant(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},_={},v=[],y={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?_[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?y[e]=t:v.push({key:e,element1Value:t,element2Value:n}))}let ee=new Set([...i.incoming()].map(e=>e.source.id)),te=new Set([...a.incoming()].map(e=>e.source.id)),b=new Set([...i.outgoing()].map(e=>e.target.id)),x=new Set([...a.outgoing()].map(e=>e.target.id)),ne=0,S=0,re=0;for(let e of ee)te.has(e)?ne++:S++;for(let e of te)ee.has(e)||re++;let C=0,ie=0,ae=0;for(let e of b)x.has(e)?C++:ie++;for(let e of x)b.has(e)||ae++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:_,different:v,common:y},relationships:{incomingOnlyElement1:S,incomingOnlyElement2:re,incomingShared:ne,outgoingOnlyElement1:ie,outgoingOnlyElement2:ae,outgoingShared:C}}}),bf=likec4Tool({name:`find-relationship-paths`,description:`
|
|
220
428
|
Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
|
|
221
429
|
|
|
222
430
|
Request:
|
|
@@ -305,7 +513,7 @@ Example response:
|
|
|
305
513
|
}
|
|
306
514
|
]
|
|
307
515
|
}
|
|
308
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:z().describe(`Source element FQN`),targetId:z().describe(`Target element FQN`),maxDepth:
|
|
516
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:z().describe(`Source element FQN`),targetId:z().describe(`Target element FQN`),maxDepth:V().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:pf},outputSchema:{paths:B(H({length:V().describe(`Number of hops in the path`),steps:B(H({source:z().describe(`Source element FQN`),target:z().describe(`Target element FQN`),relationship:H({kind:z().nullable().describe(`Relationship kind`),title:z().nullable().describe(`Relationship title`),description:z().nullable().describe(`Relationship description`),technology:z().nullable().describe(`Relationship technology`),tags:B(z()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);invariant(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);invariant(a,`Target element "${t.targetId}" not found in project "${n}"`),invariant(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}}),xf=H({id:z(),title:z(),kind:z()}),Sf=H({type:Zr([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:xf,target:xf,kind:z().nullable().describe(`Relationship kind`),title:z().nullable().describe(`Relationship title`),description:z().nullable().describe(`Relationship description`),technology:z().nullable().describe(`Relationship technology`),tags:B(z()).describe(`Relationship tags`),includedInViews:mf.describe(`Views that include this relationship`),sourceLocation:ff}),Cf=likec4Tool({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
|
|
309
517
|
Find relationships between two LikeC4 elements within a project.
|
|
310
518
|
|
|
311
519
|
What it does:
|
|
@@ -376,7 +584,7 @@ Response:
|
|
|
376
584
|
}
|
|
377
585
|
]
|
|
378
586
|
}
|
|
379
|
-
`,inputSchema:{element1:z().describe(`Element ID (FQN)`),element2:z().describe(`Element ID (FQN)`),project:
|
|
587
|
+
`,inputSchema:{element1:z().describe(`Element ID (FQN)`),element2:z().describe(`Element ID (FQN)`),project:pf},outputSchema:{found:B(Sf)}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(isSameHierarchy(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);invariant(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);invariant(o,`Element "${t.element2}" not found in project "${n}"`);let s=mkLocate(e,n),c=findConnection$3(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:includedInViews(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),wf=likec4Tool({name:`list-projects`,description:`
|
|
380
588
|
List LikeC4 projects discoverable in the current workspace.
|
|
381
589
|
|
|
382
590
|
Request:
|
|
@@ -409,7 +617,7 @@ Example response:
|
|
|
409
617
|
}
|
|
410
618
|
]
|
|
411
619
|
}
|
|
412
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:
|
|
620
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},inputSchema:{},outputSchema:{projects:B(H({id:z(),title:z(),folder:z(),sources:B(z())}))}})(async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),Tf=Zr([`exact`,`contains`,`exists`]),Ef=likec4Tool({name:`query-by-metadata`,description:`
|
|
413
621
|
Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
|
|
414
622
|
|
|
415
623
|
Request:
|
|
@@ -475,7 +683,7 @@ Example response:
|
|
|
475
683
|
}
|
|
476
684
|
]
|
|
477
685
|
}
|
|
478
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:z().describe(`Metadata key to filter by`),value:z().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:
|
|
686
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:z().describe(`Metadata key to filter by`),value:z().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Tf.optional().default(`exact`).describe(`Matching mode`),project:pf},outputSchema:{results:B(df.extend({matchedValue:z().describe(`The metadata value that matched`)}))}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],matches=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},getMatchedValue=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&matches(r,t.value,i)&&a.push({...serializeElement(e),matchedValue:getMatchedValue(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&matches(r,t.value,i)&&a.push({...serializeElement(e),matchedValue:getMatchedValue(r,t.value,i)})}}return{results:a}}),Df=likec4Tool({name:`query-by-tag-pattern`,description:`
|
|
479
687
|
Search elements by tag patterns using prefix or substring matching.
|
|
480
688
|
Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
|
|
481
689
|
|
|
@@ -530,7 +738,7 @@ Example response:
|
|
|
530
738
|
"truncated": false,
|
|
531
739
|
"matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
|
|
532
740
|
}
|
|
533
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:z().min(1).describe(`Tag pattern to match`),matchMode:
|
|
741
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:z().min(1).describe(`Tag pattern to match`),matchMode:Zr([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:pf},outputSchema:{results:B(df.extend({matchedTags:B(z()).describe(`Tags that matched the pattern`)})),truncated:Hr().describe(`True if results were truncated`),matchedTagValues:B(z()).describe(`All unique tag values matching the pattern across all elements`)}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),matchesTag=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},a=[],o=!1,s=new Set;for(let e of r.elements()){let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>s.add(e)),a.length>=50){o=!0;continue}a.push({...serializeElement(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!isDeploymentNodeModel(e))continue;let t=[...e.tags].filter(matchesTag);if(t.length>0){if(t.forEach(e=>s.add(e)),a.length>=50){o=!0;continue}a.push({...serializeElement(e),matchedTags:t})}}return{results:a,truncated:o,matchedTagValues:[...s].sort((e,t)=>e.localeCompare(t))}}),Of=likec4Tool({name:`query-by-tags`,description:`
|
|
534
742
|
Advanced tag filtering with boolean logic (AND, OR, NOT).
|
|
535
743
|
|
|
536
744
|
Request:
|
|
@@ -594,7 +802,7 @@ Example response:
|
|
|
594
802
|
}
|
|
595
803
|
]
|
|
596
804
|
}
|
|
597
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:
|
|
805
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:B(z()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:B(z()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:B(z()).optional().describe(`Element must have NONE of these tags (NOT)`),project:pf},outputSchema:{results:B(df),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 n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,matchesTags=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}matchesTags(e.tags)&&i.push(serializeElement(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}isDeploymentNodeModel(e)&&matchesTags(e.tags)&&i.push(serializeElement(e))}return{results:i,truncated:a}}),kf=Zr([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Af=likec4Tool({name:`query-graph`,description:`
|
|
598
806
|
Query element hierarchy and relationships in the architecture graph.
|
|
599
807
|
|
|
600
808
|
Request:
|
|
@@ -666,7 +874,7 @@ Example response:
|
|
|
666
874
|
],
|
|
667
875
|
"truncated": false
|
|
668
876
|
}
|
|
669
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:z().describe(`Element id (FQN) to query`),queryType:
|
|
877
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:z().describe(`Element id (FQN) to query`),queryType:kf.describe(`Type of graph query`),includeIndirect:Hr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:pf},outputSchema:{results:B(df),truncated:Hr().describe(`True if results were truncated due to exceeding maximum limit`)}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);invariant(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(serializeElement(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(serializeElement(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(serializeElement(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(serializeElement(e))}break;case`parent`:{let e=r.parent;e&&i.push(serializeElement(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(serializeElement(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(serializeElement(t))}break}}return{results:i,truncated:a}}),jf=H({elementId:z().describe(`ID of the incoming element`),relationshipLabel:z().optional().describe(`Label on the relationship`),technology:z().optional().describe(`Technology specified on the relationship`)}),Mf=likec4Tool({name:`query-incomers-graph`,description:`
|
|
670
878
|
Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
|
|
671
879
|
|
|
672
880
|
This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
|
|
@@ -723,7 +931,7 @@ Notes:
|
|
|
723
931
|
Example:
|
|
724
932
|
For a database element, this returns all services, APIs, and components that write to it,
|
|
725
933
|
plus all their dependencies, recursively up to maxDepth levels.
|
|
726
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:z().describe(`Target element id (FQN) to query incomers for`),includeIndirect:
|
|
934
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:z().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Hr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:V().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:V().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:pf},outputSchema:{target:z().describe(`Target element id`),totalNodes:V().describe(`Total number of nodes in the graph`),maxDepth:V().describe(`Maximum depth reached`),truncated:Hr().describe(`True if result was truncated due to maxNodes limit`),nodes:Wr(df.extend({incomers:B(jf).describe(`Incoming relationships with details`),depth:V().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);invariant(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=traverseGraph(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Nf=H({elementId:z().describe(`ID of the outgoing element`),relationshipLabel:z().optional().describe(`Label on the relationship`),technology:z().optional().describe(`Technology specified on the relationship`)}),Pf=likec4Tool({name:`query-outgoers-graph`,description:`
|
|
727
935
|
Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
|
|
728
936
|
|
|
729
937
|
This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
|
|
@@ -780,7 +988,7 @@ Notes:
|
|
|
780
988
|
Example:
|
|
781
989
|
For an API service, this returns all clients, services, and systems that consume its output,
|
|
782
990
|
plus all their consumers, recursively up to maxDepth levels.
|
|
783
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:z().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:
|
|
991
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:z().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Hr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:V().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:V().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:pf},outputSchema:{target:z().describe(`Target element id`),totalNodes:V().describe(`Total number of nodes in the graph`),maxDepth:V().describe(`Maximum depth reached`),truncated:Hr().describe(`True if result was truncated due to maxNodes limit`),nodes:Wr(df.extend({outgoers:B(Nf).describe(`Outgoing relationships with details`),depth:V().describe(`Distance from target element (0 = target)`)}))}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);invariant(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=traverseGraph(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Ff=likec4Tool({name:`read-deployment`,description:`
|
|
784
992
|
Read details about a deployment node or a deployed instance in a LikeC4 project.
|
|
785
993
|
|
|
786
994
|
What it does:
|
|
@@ -845,7 +1053,7 @@ Example response (deployed instance):
|
|
|
845
1053
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
|
|
846
1054
|
}
|
|
847
1055
|
}
|
|
848
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:z().describe(`Deployment id (FQN)`),project:
|
|
1056
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:z().describe(`Deployment id (FQN)`),project:pf},outputSchema:{type:Zr([`deployment-node`,`deployed-instance`]),id:z().describe(`Deployment id (FQN)`),kind:z().describe(`Deployment node kind, or element kind for deployed instances`),name:z(),title:z(),description:z().nullable(),technology:z().nullable(),tags:B(z()),project:z(),metadata:Wr(Yr([z(),B(z())])),links:B(H({title:z().nullable().describe(`Optional link title`),url:z().describe(`Link URL`),relative:z().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:z(),color:z(),children:B(z()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:mf.describe(`Views that include this deployment node`),instanceof:H({id:z().describe(`Element ID (FQN)`),title:z(),kind:z()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:ff}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);invariant(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=mkLocate(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:includedInViews(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),If=likec4Tool({name:`read-element`,description:`
|
|
849
1057
|
Read detailed information about a LikeC4 element.
|
|
850
1058
|
|
|
851
1059
|
Request:
|
|
@@ -932,7 +1140,7 @@ Example response:
|
|
|
932
1140
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
|
|
933
1141
|
}
|
|
934
1142
|
}
|
|
935
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:z().describe(`Element id (FQN)`),project:
|
|
1143
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:z().describe(`Element id (FQN)`),project:pf},outputSchema:{id:z().describe(`Element id (FQN)`),kind:z().describe(`Element kind`),name:z().describe(`Element name`),title:z(),description:z().nullable(),technology:z().nullable(),tags:B(z()),project:z(),metadata:Wr(Yr([z(),B(z())])),links:B(H({title:z().nullable().describe(`Optional link title`),url:z().describe(`Link URL`),relative:z().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:z(),color:z(),children:B(z()).describe(`Children of this element (Array of FQNs)`),defaultView:z().nullable().describe(`Name of the default view of this element`),includedInViews:mf.describe(`Views that include this element`),relationships:H({incoming:B(H({source:H({id:z(),title:z(),kind:z()}).describe(`Source element of this relationship`),kind:z().nullable().describe(`Relationship kind`),target:z().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:z().nullable().describe(`Relationship title`),description:z().nullable().describe(`Relationship description`),technology:z().nullable().describe(`Relationship technology`),tags:B(z()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:B(H({source:z().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:H({id:z(),title:z(),kind:z()}).describe(`Target element of this relationship`),kind:z().nullable().describe(`Relationship kind`),title:z().nullable().describe(`Relationship title`),description:z().nullable().describe(`Relationship description`),technology:z().nullable().describe(`Relationship technology`),tags:B(z()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:B(z()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:ff}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);invariant(r,`Element "${t.id}" not found in project "${n}"`);let i=mkLocate(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:includedInViews(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),Lf=likec4Tool({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
|
|
936
1144
|
Request:
|
|
937
1145
|
- project: string (optional) — project id. Defaults to "default" if omitted.
|
|
938
1146
|
|
|
@@ -1023,7 +1231,7 @@ Example response:
|
|
|
1023
1231
|
}
|
|
1024
1232
|
]
|
|
1025
1233
|
}
|
|
1026
|
-
`,inputSchema:{project:
|
|
1234
|
+
`,inputSchema:{project:pf},outputSchema:{title:z(),folder:z(),sources:B(z()),config:uf.describe(`Project configuration`),specification:H({elementKinds:B(z()),relationshipKinds:B(z()),deploymentKinds:B(z()),tags:B(z()),metadataKeys:B(z())}),elements:B(H({id:z(),kind:z(),title:z(),tags:B(z())})).describe(`List of elements in the project`),deployments:B(Jr(`type`,[H({type:Ur(`deployment-node`),id:z().describe(`Node ID`),kind:z().describe(`Deployment node kind`),title:z().describe(`Node title`),tags:B(z())}),H({type:Ur(`deployed-instance`),id:z().describe(`Node ID`),title:z().describe(`Node title`),tags:B(z()),referencedElementId:z().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:B(H({id:z(),title:z(),type:Zr([`element`,`deployment`,`dynamic`])}))}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:serializeConfig(r.config),specification:{elementKinds:a(i.specification.elements),relationshipKinds:a(i.specification.relationships),deploymentKinds:a(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),modelRef=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Rf=Jr(`type`,[H({type:Ur(`element`),id:z().describe(`Node ID`),elementId:z().describe(`Element ID (FQN)`),kind:z().describe(`Element kind`),title:z().describe(`Node title`),description:z().nullable(),technology:z().nullable(),children:B(z()).describe(`Children nodes, array of node IDs`),shape:z().describe(`Rendered shape`),color:z().describe(`Rendered color`),tags:B(z())}),H({type:Ur(`deployment-node`),id:z().describe(`Node ID`),deploymentId:z().describe(`Deployment entity ID (FQN)`),kind:z().describe(`Deployment kind`),title:z().describe(`Node title`),description:z().nullable(),technology:z().nullable(),children:B(z()).describe(`Children nodes, array of node IDs`),shape:z().describe(`Rendered shape`),color:z().describe(`Rendered color`),tags:B(z())}),H({type:Ur(`deployed-instance`),id:z().describe(`Node ID`),deploymentId:z().describe(`Deployment entity ID (FQN)`),title:z().describe(`Node title`),description:z().nullable(),technology:z().nullable(),referencedElement:H({id:z().describe(`Element ID (FQN)`),kind:z().describe(`Element kind`),title:z().describe(`Element title`)}),shape:z().describe(`Rendered shape`),color:z().describe(`Rendered color`),tags:B(z())})]),zf=likec4Tool({name:`read-view`,description:`
|
|
1027
1235
|
Read detailed information about a LikeC4 view.
|
|
1028
1236
|
|
|
1029
1237
|
Request:
|
|
@@ -1071,7 +1279,7 @@ Example response:
|
|
|
1071
1279
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
|
|
1072
1280
|
}
|
|
1073
1281
|
}
|
|
1074
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:z().describe(`View id (name)`),project:
|
|
1282
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:z().describe(`View id (name)`),project:pf},outputSchema:{id:z(),type:Zr([`element`,`deployment`,`dynamic`]).describe(`View type`),title:z(),description:z().nullable(),tags:B(z()),project:z(),nodes:B(Rf),edges:B(H({source:z().describe(`Source node`),target:z().describe(`Target node`),label:z().nullable(),description:z().nullable(),technology:z().nullable(),tags:B(z())})).describe(`Edge represents relationship between nodes`),sourceLocation:ff}})(async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=mkLocate(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>modelRef(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),Bf=B(Jr(`type`,[H({type:Ur(`element`),project:z().describe(`Project ID`),id:z().describe(`Element ID (FQN)`),name:z().describe(`Element name`),kind:z(),title:z(),technology:z().nullable(),shape:z(),includedInViews:mf,metadata:Wr(Yr([z(),B(z())])),tags:B(z())}),H({type:Ur(`deployment-node`),project:z().describe(`Project ID`),id:z().describe(`Deployment ID (FQN)`),name:z().describe(`Deployment name`),kind:z(),title:z(),technology:z().nullable(),shape:z(),includedInViews:mf,metadata:Wr(Yr([z(),B(z())])),tags:B(z())})])),Vf=likec4Tool({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
|
|
1075
1283
|
Search LikeC4 elements and deployment nodes across all projects.
|
|
1076
1284
|
|
|
1077
1285
|
Query syntax (case-insensitive):
|
|
@@ -1126,7 +1334,7 @@ Example response:
|
|
|
1126
1334
|
}
|
|
1127
1335
|
]
|
|
1128
1336
|
}
|
|
1129
|
-
`,inputSchema:{search:z().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:
|
|
1337
|
+
`,inputSchema:{search:z().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:V(),found:Bf}})(async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),predicate;i.startsWith(`kind:`)?(i=i.slice(5),$.debug(`search by kind: {search}`,{search:i}),predicate=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),$.debug(`search by shape: {search}`,{search:i}),predicate=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),$.debug(`search by metadata: {search}`,{search:i}),predicate=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),$.debug(`search by tag: {search}`,{search:i}),predicate=e=>e.tags.some(e=>e.toLowerCase().includes(i))):($.debug(`search by id/title: {search}`,{search:i}),predicate=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of ifilter(n.elements(),e=>!e.imported&&predicate(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:includedInViews(e.views())});for(let e of ifilter(n.deployment.nodes(),predicate))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:includedInViews(e.views())})}catch(e){$.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Hf=H({id:z().describe(`Element id (FQN)`),name:z().describe(`Element name`),kind:z().describe(`Element kind`),title:z().describe(`Human-readable title`),depth:V().describe(`Depth relative to the root element (1 = direct child)`),tags:B(z()).describe(`Assigned tags`),metadata:Wr(Yr([z(),B(z())])).describe(`Element metadata`),childCount:V().describe(`Number of direct children`),incomingCount:V().describe(`Number of incoming relationships`),outgoingCount:V().describe(`Number of outgoing relationships`)}),Uf=likec4Tool({name:`subgraph-summary`,description:`
|
|
1130
1338
|
Get a compact, table-friendly summary of all descendants of a parent element.
|
|
1131
1339
|
Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
|
|
1132
1340
|
Much more efficient than calling read-element for each descendant individually.
|
|
@@ -1192,7 +1400,7 @@ Example response:
|
|
|
1192
1400
|
"truncated": false,
|
|
1193
1401
|
"truncatedByDepth": false
|
|
1194
1402
|
}
|
|
1195
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:z().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:
|
|
1403
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:z().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:V().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:B(z()).optional().describe(`If provided, only include these metadata keys in the response`),project:pf},outputSchema:{root:H({id:z(),kind:z(),title:z(),childCount:V()}),descendants:B(Hf),totalDescendants:V().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 n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);invariant(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});function createMCPServer(e){let t=new Qr({name:`LikeC4`,version:$d},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
|
|
1196
1404
|
|
|
1197
1405
|
Conventions:
|
|
1198
1406
|
- All tools are read-only and idempotent.
|
|
@@ -1225,4 +1433,4 @@ Instructions:
|
|
|
1225
1433
|
- If response returns "sourceLocation", provide link to this location in the editor
|
|
1226
1434
|
|
|
1227
1435
|
Full documentation: https://likec4.dev/llms-full.txt
|
|
1228
|
-
`,enforceStrictCapabilities:!0
|
|
1436
|
+
`,enforceStrictCapabilities:!0,capabilities:{completions:{},tools:{},logging:{},prompts:{},resources:{}}});return t.server.onerror=e=>{ea.error(loggable(e))},E(t,setMcpServerCtx,wf,Lf,If,Ff,zf,Vf,Cf,bf,Be(Af,Mf,Pf,Ef,Of,Df),Be(gf,yf,Uf),Be(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||($.info(`Starting MCP stdio server`),this._mcp=createMCPServer(this.services),setMcpServerCtx(this._mcp),this.transport=new Gr,await this._mcp.connect(this.transport),$.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{$.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(`*`,pr({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e();setMcpServerCtx(n);let r=new ur({eventStore:new gr({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>($.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)=>($.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:n}=e,r=await createHonoApp(t);return new Promise((e,t)=>{let i=ei({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.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()}$.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await startServer({factory:()=>createMCPServer(this.services),port:e}),$.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?($.info(`Stopping MCP server`),this.server=void 0,setMcpServerCtx(void 0),new Promise(t=>{e.close(e=>{e?$.error(`Failed to stop MCP server`,{err:e}):$.info(`MCP server stopped`),t()})})):($.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};async function initLikeC4MCP(e){let t=nt(e,{workspacePath:`.`,mcp:`stdio`,graphviz:`wasm`,watch:!0,throwIfInvalid:!1,configureLogger:!0});t.configureLogger&&(configureLanguageServerLogger({useStdErr:t.mcp===`stdio`,colors:Br.isColorSupported&&t.mcp!==`stdio`,logLevel:mi?`debug`:`info`}),process.on(`uncaughtException`,e=>{$.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{$.error(`unhandledRejection`,{err:e})}));let n=ii(t.workspacePath);$.info`Loading LikeC4 from workspace: ${n}`;let r=await fromWorkspace(n,{graphviz:t.graphviz,manualLayouts:!0,configureLogger:!1,watch:t.watch,throwIfInvalid:t.throwIfInvalid}),i=setLanguageServicesCtx(r.languageServices);return{server:t.mcp===`stdio`?new StdioLikeC4MCPServer(i):new StreamableLikeC4MCPServer(i,t.mcp.port),likec4:r}}async function startLikeC4MCP(e){let t=await initLikeC4MCP(e);return await t.server.start(),t}export{startLikeC4MCP as n,$ as r,initLikeC4MCP as t};
|