├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── deploy.ps1 ├── dist ├── assets │ ├── index.2fc71c55.js │ └── index.8274c96c.css └── index.html ├── examples ├── ex1.json ├── ex2.json ├── ex3.json └── ex4.json ├── index.html ├── package-lock.json ├── package.json ├── src ├── app │ ├── app.vue │ ├── graphics.ts │ ├── keyboard.ts │ ├── mouse.ts │ ├── persistence.ts │ └── solve.ts ├── entities │ ├── circle.ts │ ├── node.ts │ └── point.ts ├── env.d.ts ├── main.css └── main.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Graph coloring 2 | 3 | This is an interactive graph editor that colors the graph with the least amount of colors possible so there is no node with the same color connected 4 | 5 | [more information about the problem](https://en.wikipedia.org/wiki/Graph_coloring) 6 | 7 | https://github.com/Thiago099/graph-coloring/assets/66787043/2f62da31-be2a-4eac-98f1-327af39e3cd1 8 | 9 | 10 | [live demo](https://thiago099.github.io/graph-coloring/) 11 | 12 | [download some examples](https://github.com/Thiago099/graph-coloring/tree/master/examples) 13 | 14 | ## commands 15 | 16 | Left button to create a node 17 | left button on a node to move it 18 | Middle button to connect (if there is no legal target it will create an end node) 19 | Right button to delete 20 | 21 | Middle button on empty space to create node and start a connection from it 22 | 23 | The left button on empty space to create a node and drag it 24 | 25 | Right button on the empty space to move everything 26 | 27 | ctrl+s to save in a file 28 | 29 | ctrl+l to load in a file 30 | 31 | ctrl+c to clear 32 | 33 | ## explanation of the algorithm 34 | ``` 35 | for each node find some of its odd node count cycles 36 | Sort the nodes and connections by the odd cycles found so the algorithm eliminates the maximum amount of odd cycle nodes 37 | Loop: 38 | Chose the first node and set it to the current color (the highest odd cycle node), ignore all the nodes around it and from them chose the next highest priority node 39 | Eliminate the done nodes as its odd cycles as they are now broken 40 | Sort the remaining nodes by their odd cycles 41 | Increment the current color 42 | 43 | ``` 44 | [implementation](https://github.com/Thiago099/graph-coloring/blob/master/src/app/solve.ts) 45 | 46 | 47 | # Running locally 48 | 49 | [source code](https://github.com/Thiago099/graph-coloring) 50 | 51 | ## Install node 52 | https://nodejs.org/en/download/ 53 | 54 | ## Project setup 55 | ``` 56 | npm i 57 | ``` 58 | 59 | ### Compiles and hot-reloads for development 60 | ``` 61 | npm run dev 62 | ``` 63 | 64 | ### Compiles and minifies for production 65 | ``` 66 | npm run build 67 | ``` 68 | 69 | ## Animation 70 | here is the repository to the procedural graph coloring animation generation program 71 | 72 | https://github.com/Thiago099/graph-coloring-animator 73 | -------------------------------------------------------------------------------- /deploy.ps1: -------------------------------------------------------------------------------- 1 | npm run build 2 | git add dist -f 3 | git commit -m "Deploy to GitHub Pages" 4 | git subtree push --prefix dist origin gh-pages 5 | -------------------------------------------------------------------------------- /dist/assets/index.2fc71c55.js: -------------------------------------------------------------------------------- 1 | var lo=Object.defineProperty;var $n=Object.getOwnPropertySymbols;var co=Object.prototype.hasOwnProperty,fo=Object.prototype.propertyIsEnumerable;var Sn=(e,t,n)=>t in e?lo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,he=(e,t)=>{for(var n in t||(t={}))co.call(t,n)&&Sn(e,n,t[n]);if($n)for(var n of $n(t))fo.call(t,n)&&Sn(e,n,t[n]);return e};const uo=function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const r of i.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerpolicy&&(i.referrerPolicy=o.referrerpolicy),o.crossorigin==="use-credentials"?i.credentials="include":o.crossorigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}};uo();function dn(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const ao="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",ho=dn(ao);function ps(e){return!!e||e===""}function hn(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(go);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function pn(e){let t="";if(Y(e))t=e;else if(N(e))for(let n=0;n{},_o=()=>!1,bo=/^on[^a-z]/,At=e=>bo.test(e),gn=e=>e.startsWith("onUpdate:"),X=Object.assign,mn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},yo=Object.prototype.hasOwnProperty,R=(e,t)=>yo.call(e,t),N=Array.isArray,st=e=>Ft(e)==="[object Map]",xo=e=>Ft(e)==="[object Set]",F=e=>typeof e=="function",Y=e=>typeof e=="string",_n=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",gs=e=>Z(e)&&F(e.then)&&F(e.catch),wo=Object.prototype.toString,Ft=e=>wo.call(e),vo=e=>Ft(e).slice(8,-1),Co=e=>Ft(e)==="[object Object]",bn=e=>Y(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,xt=dn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Nt=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Eo=/-(\w)/g,qe=Nt(e=>e.replace(Eo,(t,n)=>n?n.toUpperCase():"")),Oo=/\B([A-Z])/g,Je=Nt(e=>e.replace(Oo,"-$1").toLowerCase()),ms=Nt(e=>e.charAt(0).toUpperCase()+e.slice(1)),kt=Nt(e=>e?`on${ms(e)}`:""),vt=(e,t)=>!Object.is(e,t),qt=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Mo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Bn;const Po=()=>Bn||(Bn=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let ce;class To{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&ce&&(this.parent=ce,this.index=(ce.scopes||(ce.scopes=[])).push(this)-1)}run(t){if(this.active){const n=ce;try{return ce=this,t()}finally{ce=n}}}on(){ce=this}off(){ce=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},_s=e=>(e.w&Oe)>0,bs=e=>(e.n&Oe)>0,Ao=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=s)&&c.push(u)});else switch(n!==void 0&&c.push(r.get(n)),t){case"add":N(e)?bn(n)&&c.push(r.get("length")):(c.push(r.get(Fe)),st(e)&&c.push(r.get(Gt)));break;case"delete":N(e)||(c.push(r.get(Fe)),st(e)&&c.push(r.get(Gt)));break;case"set":st(e)&&c.push(r.get(Fe));break}if(c.length===1)c[0]&&en(c[0]);else{const u=[];for(const d of c)d&&u.push(...d);en(yn(u))}}function en(e,t){for(const n of N(e)?e:[...e])(n!==ue||n.allowRecurse)&&(n.scheduler?n.scheduler():n.run())}const No=dn("__proto__,__v_isRef,__isVue"),ws=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(_n)),Ro=wn(),jo=wn(!1,!0),Do=wn(!0),kn=Uo();function Uo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=D(this);for(let i=0,r=this.length;i{e[t]=function(...n){Ye();const s=D(this)[t].apply(this,n);return Ve(),s}}),e}function wn(e=!1,t=!1){return function(s,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?Qo:Ms:t?Os:Es).get(s))return s;const r=N(s);if(!e&&r&&R(kn,o))return Reflect.get(kn,o,i);const c=Reflect.get(s,o,i);return(_n(o)?ws.has(o):No(o))||(e||ne(s,"get",o),t)?c:J(c)?!r||!bn(o)?c.value:c:Z(c)?e?Ps(c):En(c):c}}const Lo=vs(),Ko=vs(!0);function vs(e=!1){return function(n,s,o,i){let r=n[s];if(lt(r)&&J(r)&&!J(o))return!1;if(!e&&!lt(o)&&(Ts(o)||(o=D(o),r=D(r)),!N(n)&&J(r)&&!J(o)))return r.value=o,!0;const c=N(n)&&bn(s)?Number(s)e,Rt=e=>Reflect.getPrototypeOf(e);function gt(e,t,n=!1,s=!1){e=e.__v_raw;const o=D(e),i=D(t);t!==i&&!n&&ne(o,"get",t),!n&&ne(o,"get",i);const{has:r}=Rt(o),c=s?vn:n?Pn:Mn;if(r.call(o,t))return c(e.get(t));if(r.call(o,i))return c(e.get(i));e!==o&&e.get(t)}function mt(e,t=!1){const n=this.__v_raw,s=D(n),o=D(e);return e!==o&&!t&&ne(s,"has",e),!t&&ne(s,"has",o),e===o?n.has(e):n.has(e)||n.has(o)}function _t(e,t=!1){return e=e.__v_raw,!t&&ne(D(e),"iterate",Fe),Reflect.get(e,"size",e)}function qn(e){e=D(e);const t=D(this);return Rt(t).has.call(t,e)||(t.add(e),_e(t,"add",e,e)),this}function zn(e,t){t=D(t);const n=D(this),{has:s,get:o}=Rt(n);let i=s.call(n,e);i||(e=D(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?vt(t,r)&&_e(n,"set",e,t):_e(n,"add",e,t),this}function Jn(e){const t=D(this),{has:n,get:s}=Rt(t);let o=n.call(t,e);o||(e=D(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&_e(t,"delete",e,void 0),i}function Yn(){const e=D(this),t=e.size!==0,n=e.clear();return t&&_e(e,"clear",void 0,void 0),n}function bt(e,t){return function(s,o){const i=this,r=i.__v_raw,c=D(r),u=t?vn:e?Pn:Mn;return!e&&ne(c,"iterate",Fe),r.forEach((d,m)=>s.call(o,u(d),u(m),i))}}function yt(e,t,n){return function(...s){const o=this.__v_raw,i=D(o),r=st(i),c=e==="entries"||e===Symbol.iterator&&r,u=e==="keys"&&r,d=o[e](...s),m=n?vn:t?Pn:Mn;return!t&&ne(i,"iterate",u?Gt:Fe),{next(){const{value:x,done:C}=d.next();return C?{value:x,done:C}:{value:c?[m(x[0]),m(x[1])]:m(x),done:C}},[Symbol.iterator](){return this}}}}function xe(e){return function(...t){return e==="delete"?!1:this}}function ko(){const e={get(i){return gt(this,i)},get size(){return _t(this)},has:mt,add:qn,set:zn,delete:Jn,clear:Yn,forEach:bt(!1,!1)},t={get(i){return gt(this,i,!1,!0)},get size(){return _t(this)},has:mt,add:qn,set:zn,delete:Jn,clear:Yn,forEach:bt(!1,!0)},n={get(i){return gt(this,i,!0)},get size(){return _t(this,!0)},has(i){return mt.call(this,i,!0)},add:xe("add"),set:xe("set"),delete:xe("delete"),clear:xe("clear"),forEach:bt(!0,!1)},s={get(i){return gt(this,i,!0,!0)},get size(){return _t(this,!0)},has(i){return mt.call(this,i,!0)},add:xe("add"),set:xe("set"),delete:xe("delete"),clear:xe("clear"),forEach:bt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=yt(i,!1,!1),n[i]=yt(i,!0,!1),t[i]=yt(i,!1,!0),s[i]=yt(i,!0,!0)}),[e,n,t,s]}const[qo,zo,Jo,Yo]=ko();function Cn(e,t){const n=t?e?Yo:Jo:e?zo:qo;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(R(n,o)&&o in s?n:s,o,i)}const Vo={get:Cn(!1,!1)},Xo={get:Cn(!1,!0)},Zo={get:Cn(!0,!1)},Es=new WeakMap,Os=new WeakMap,Ms=new WeakMap,Qo=new WeakMap;function Go(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ei(e){return e.__v_skip||!Object.isExtensible(e)?0:Go(vo(e))}function En(e){return lt(e)?e:On(e,!1,Cs,Vo,Es)}function ti(e){return On(e,!1,Wo,Xo,Os)}function Ps(e){return On(e,!0,Bo,Zo,Ms)}function On(e,t,n,s,o){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=ei(e);if(r===0)return e;const c=new Proxy(e,r===2?s:n);return o.set(e,c),c}function ke(e){return lt(e)?ke(e.__v_raw):!!(e&&e.__v_isReactive)}function lt(e){return!!(e&&e.__v_isReadonly)}function Ts(e){return!!(e&&e.__v_isShallow)}function Is(e){return ke(e)||lt(e)}function D(e){const t=e&&e.__v_raw;return t?D(t):e}function As(e){return Ct(e,"__v_skip",!0),e}const Mn=e=>Z(e)?En(e):e,Pn=e=>Z(e)?Ps(e):e;function ni(e){Ce&&ue&&(e=D(e),xs(e.dep||(e.dep=yn())))}function si(e,t){e=D(e),e.dep&&en(e.dep)}function J(e){return!!(e&&e.__v_isRef===!0)}function oi(e){return J(e)?e.value:e}const ii={get:(e,t,n)=>oi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return J(o)&&!J(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Fs(e){return ke(e)?e:new Proxy(e,ii)}class ri{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new xn(t,()=>{this._dirty||(this._dirty=!0,si(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=D(this);return ni(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function li(e,t,n=!1){let s,o;const i=F(e);return i?(s=e,o=oe):(s=e.get,o=e.set),new ri(s,o,i||!o,n)}Promise.resolve();function Ee(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){jt(i,t,n)}return o}function ie(e,t,n,s){if(F(e)){const i=Ee(e,t,n,s);return i&&gs(i)&&i.catch(r=>{jt(r,t,n)}),i}const o=[];for(let i=0;i>>1;ct(te[s])ge&&te.splice(t,1)}function Ds(e,t,n,s){N(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?s+1:s))&&n.push(e),js()}function di(e){Ds(e,nt,ot,$e)}function hi(e){Ds(e,we,it,Se)}function In(e,t=null){if(ot.length){for(nn=t,nt=[...new Set(ot)],ot.length=0,$e=0;$ect(n)-ct(s)),Se=0;See.id==null?1/0:e.id;function Ls(e){tn=!1,Et=!0,In(e),te.sort((n,s)=>ct(n)-ct(s));const t=oe;try{for(ge=0;geA.trim()):x&&(o=n.map(Mo))}let c,u=s[c=kt(t)]||s[c=kt(qe(t))];!u&&i&&(u=s[c=kt(Je(t))]),u&&ie(u,e,6,o);const d=s[c+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,ie(d,e,6,o)}}function Ks(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},c=!1;if(!F(e)){const u=d=>{const m=Ks(d,t,!0);m&&(c=!0,X(r,m))};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!i&&!c?(s.set(e,null),null):(N(i)?i.forEach(u=>r[u]=null):X(r,i),s.set(e,r),r)}function Dt(e,t){return!e||!At(t)?!1:(t=t.slice(2).replace(/Once$/,""),R(e,t[0].toLowerCase()+t.slice(1))||R(e,Je(t))||R(e,t))}let me=null,Hs=null;function Ot(e){const t=me;return me=e,Hs=e&&e.type.__scopeId||null,t}function gi(e,t=me,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&ss(-1);const i=Ot(t),r=e(...o);return Ot(i),s._d&&ss(1),r};return s._n=!0,s._c=!0,s._d=!0,s}function zt(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:c,attrs:u,emit:d,render:m,renderCache:x,data:C,setupState:A,ctx:L,inheritAttrs:v}=e;let P,T;const k=Ot(e);try{if(n.shapeFlag&4){const W=o||s;P=fe(m.call(W,W,x,i,A,C,L)),T=u}else{const W=t;P=fe(W.length>1?W(i,{attrs:u,slots:c,emit:d}):W(i,null)),T=t.props?u:mi(u)}}catch(W){rt.length=0,jt(W,e,1),P=Re(ft)}let q=P;if(T&&v!==!1){const W=Object.keys(T),{shapeFlag:De}=q;W.length&&De&7&&(r&&W.some(gn)&&(T=_i(T,r)),q=ut(q,T))}return n.dirs&&(q.dirs=q.dirs?q.dirs.concat(n.dirs):n.dirs),n.transition&&(q.transition=n.transition),P=q,Ot(k),P}const mi=e=>{let t;for(const n in e)(n==="class"||n==="style"||At(n))&&((t||(t={}))[n]=e[n]);return t},_i=(e,t)=>{const n={};for(const s in e)(!gn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function bi(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:c,patchFlag:u}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&u>=0){if(u&1024)return!0;if(u&16)return s?Vn(s,r,d):!!r;if(u&8){const m=t.dynamicProps;for(let x=0;xe.__isSuspense;function wi(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):hi(e)}function vi(e,t){if(z){let n=z.provides;const s=z.parent&&z.parent.provides;s===n&&(n=z.provides=Object.create(s)),n[e]=t}}function Jt(e,t,n=!1){const s=z||me;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&F(t)?t.call(s.proxy):t}}const Xn={};function Yt(e,t,n){return $s(e,t,n)}function $s(e,t,{immediate:n,deep:s,flush:o,onTrack:i,onTrigger:r}=K){const c=z;let u,d=!1,m=!1;if(J(e)?(u=()=>e.value,d=Ts(e)):ke(e)?(u=()=>e,s=!0):N(e)?(m=!0,d=e.some(ke),u=()=>e.map(T=>{if(J(T))return T.value;if(ke(T))return Be(T);if(F(T))return Ee(T,c,2)})):F(e)?t?u=()=>Ee(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return x&&x(),ie(e,c,3,[C])}:u=oe,t&&s){const T=u;u=()=>Be(T())}let x,C=T=>{x=P.onStop=()=>{Ee(T,c,4)}};if(at)return C=oe,t?n&&ie(t,c,3,[u(),m?[]:void 0,C]):u(),oe;let A=m?[]:Xn;const L=()=>{if(!!P.active)if(t){const T=P.run();(s||d||(m?T.some((k,q)=>vt(k,A[q])):vt(T,A)))&&(x&&x(),ie(t,c,3,[T,A===Xn?void 0:A,C]),A=T)}else P.run()};L.allowRecurse=!!t;let v;o==="sync"?v=L:o==="post"?v=()=>G(L,c&&c.suspense):v=()=>{!c||c.isMounted?di(L):L()};const P=new xn(u,v);return t?n?L():A=P.run():o==="post"?G(P.run.bind(P),c&&c.suspense):P.run(),()=>{P.stop(),c&&c.scope&&mn(c.scope.effects,P)}}function Ci(e,t,n){const s=this.proxy,o=Y(e)?e.includes(".")?Ss(s,e):()=>s[e]:e.bind(s,s);let i;F(t)?i=t:(i=t.handler,n=t);const r=z;ze(this);const c=$s(o,i.bind(s),n);return r?ze(r):je(),c}function Ss(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Be(n,t)});else if(Co(e))for(const n in e)Be(e[n],t);return e}function Ei(e){return F(e)?{setup:e,name:e.name}:e}const sn=e=>!!e.type.__asyncLoader,Bs=e=>e.type.__isKeepAlive;function Oi(e,t){Ws(e,"a",t)}function Mi(e,t){Ws(e,"da",t)}function Ws(e,t,n=z){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ut(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Bs(o.parent.vnode)&&Pi(s,t,n,o),o=o.parent}}function Pi(e,t,n,s){const o=Ut(t,e,s,!0);ks(()=>{mn(s[t],o)},n)}function Ut(e,t,n=z,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Ye(),ze(n);const c=ie(t,n,e,r);return je(),Ve(),c});return s?o.unshift(i):o.push(i),i}}const be=e=>(t,n=z)=>(!at||e==="sp")&&Ut(e,t,n),Ti=be("bm"),Ii=be("m"),Ai=be("bu"),Fi=be("u"),Ni=be("bum"),ks=be("um"),Ri=be("sp"),ji=be("rtg"),Di=be("rtc");function Ui(e,t=z){Ut("ec",e,t)}let on=!0;function Li(e){const t=zs(e),n=e.proxy,s=e.ctx;on=!1,t.beforeCreate&&Zn(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:c,provide:u,inject:d,created:m,beforeMount:x,mounted:C,beforeUpdate:A,updated:L,activated:v,deactivated:P,beforeDestroy:T,beforeUnmount:k,destroyed:q,unmounted:W,render:De,renderTracked:Kt,renderTriggered:Ht,errorCaptured:dt,serverPrefetch:Me,expose:Xe,inheritAttrs:Ue,components:Ze,directives:ht,filters:jn}=t;if(d&&Ki(d,s,null,e.appContext.config.unwrapInjectedRef),r)for(const B in r){const H=r[B];F(H)&&(s[B]=H.bind(n))}if(o){const B=o.call(n,n);Z(B)&&(e.data=En(B))}if(on=!0,i)for(const B in i){const H=i[B],ae=F(H)?H.bind(n,n):F(H.get)?H.get.bind(n,n):oe,St=!F(H)&&F(H.set)?H.set.bind(n):oe,Qe=br({get:ae,set:St});Object.defineProperty(s,B,{enumerable:!0,configurable:!0,get:()=>Qe.value,set:Le=>Qe.value=Le})}if(c)for(const B in c)qs(c[B],s,n,B);if(u){const B=F(u)?u.call(n):u;Reflect.ownKeys(B).forEach(H=>{vi(H,B[H])})}m&&Zn(m,e,"c");function Q(B,H){N(H)?H.forEach(ae=>B(ae.bind(n))):H&&B(H.bind(n))}if(Q(Ti,x),Q(Ii,C),Q(Ai,A),Q(Fi,L),Q(Oi,v),Q(Mi,P),Q(Ui,dt),Q(Di,Kt),Q(ji,Ht),Q(Ni,k),Q(ks,W),Q(Ri,Me),N(Xe))if(Xe.length){const B=e.exposed||(e.exposed={});Xe.forEach(H=>{Object.defineProperty(B,H,{get:()=>n[H],set:ae=>n[H]=ae})})}else e.exposed||(e.exposed={});De&&e.render===oe&&(e.render=De),Ue!=null&&(e.inheritAttrs=Ue),Ze&&(e.components=Ze),ht&&(e.directives=ht)}function Ki(e,t,n=oe,s=!1){N(e)&&(e=rn(e));for(const o in e){const i=e[o];let r;Z(i)?"default"in i?r=Jt(i.from||o,i.default,!0):r=Jt(i.from||o):r=Jt(i),J(r)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:c=>r.value=c}):t[o]=r}}function Zn(e,t,n){ie(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function qs(e,t,n,s){const o=s.includes(".")?Ss(n,s):()=>n[s];if(Y(e)){const i=t[e];F(i)&&Yt(o,i)}else if(F(e))Yt(o,e.bind(n));else if(Z(e))if(N(e))e.forEach(i=>qs(i,t,n,s));else{const i=F(e.handler)?e.handler.bind(n):t[e.handler];F(i)&&Yt(o,i,e)}}function zs(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,c=i.get(t);let u;return c?u=c:!o.length&&!n&&!s?u=t:(u={},o.length&&o.forEach(d=>Mt(u,d,r,!0)),Mt(u,t,r)),i.set(t,u),u}function Mt(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&Mt(e,i,n,!0),o&&o.forEach(r=>Mt(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const c=Hi[r]||n&&n[r];e[r]=c?c(e[r],t[r]):t[r]}return e}const Hi={data:Qn,props:Ie,emits:Ie,methods:Ie,computed:Ie,beforeCreate:V,created:V,beforeMount:V,mounted:V,beforeUpdate:V,updated:V,beforeDestroy:V,beforeUnmount:V,destroyed:V,unmounted:V,activated:V,deactivated:V,errorCaptured:V,serverPrefetch:V,components:Ie,directives:Ie,watch:Si,provide:Qn,inject:$i};function Qn(e,t){return t?e?function(){return X(F(e)?e.call(this,this):e,F(t)?t.call(this,this):t)}:t:e}function $i(e,t){return Ie(rn(e),rn(t))}function rn(e){if(N(e)){const t={};for(let n=0;n0)&&!(r&16)){if(r&8){const m=e.vnode.dynamicProps;for(let x=0;x{u=!0;const[C,A]=Ys(x,t,!0);X(r,C),A&&c.push(...A)};!n&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}if(!i&&!u)return s.set(e,We),We;if(N(i))for(let m=0;m-1,A[1]=v<0||L-1||R(A,"default"))&&c.push(x)}}}const d=[r,c];return s.set(e,d),d}function Gn(e){return e[0]!=="$"}function es(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function ts(e,t){return es(e)===es(t)}function ns(e,t){return N(t)?t.findIndex(n=>ts(n,e)):F(t)&&ts(t,e)?0:-1}const Vs=e=>e[0]==="_"||e==="$stable",An=e=>N(e)?e.map(fe):[fe(e)],ki=(e,t,n)=>{const s=gi((...o)=>An(t(...o)),n);return s._c=!1,s},Xs=(e,t,n)=>{const s=e._ctx;for(const o in e){if(Vs(o))continue;const i=e[o];if(F(i))t[o]=ki(o,i,s);else if(i!=null){const r=An(i);t[o]=()=>r}}},Zs=(e,t)=>{const n=An(t);e.slots.default=()=>n},qi=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=D(t),Ct(t,"_",n)):Xs(t,e.slots={})}else e.slots={},t&&Zs(e,t);Ct(e.slots,Lt,1)},zi=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=K;if(s.shapeFlag&32){const c=t._;c?n&&c===1?i=!1:(X(o,t),!n&&c===1&&delete o._):(i=!t.$stable,Xs(t,o)),r=t}else t&&(Zs(e,t),r={default:1});if(i)for(const c in o)!Vs(c)&&!(c in r)&&delete o[c]};function Pe(e,t,n,s){const o=e.dirs,i=t&&t.dirs;for(let r=0;rcn(C,t&&(N(t)?t[A]:t),n,s,o));return}if(sn(s)&&!o)return;const i=s.shapeFlag&4?Rn(s.component)||s.component.proxy:s.el,r=o?null:i,{i:c,r:u}=e,d=t&&t.r,m=c.refs===K?c.refs={}:c.refs,x=c.setupState;if(d!=null&&d!==u&&(Y(d)?(m[d]=null,R(x,d)&&(x[d]=null)):J(d)&&(d.value=null)),F(u))Ee(u,c,12,[r,m]);else{const C=Y(u),A=J(u);if(C||A){const L=()=>{if(e.f){const v=C?m[u]:u.value;o?N(v)&&mn(v,i):N(v)?v.includes(i)||v.push(i):C?(m[u]=[i],R(x,u)&&(x[u]=m[u])):(u.value=[i],e.k&&(m[e.k]=u.value))}else C?(m[u]=r,R(x,u)&&(x[u]=r)):J(u)&&(u.value=r,e.k&&(m[e.k]=r))};r?(L.id=-1,G(L,n)):L()}}}const G=wi;function Vi(e){return Xi(e)}function Xi(e,t){const n=Po();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:c,createComment:u,setText:d,setElementText:m,parentNode:x,nextSibling:C,setScopeId:A=oe,cloneNode:L,insertStaticContent:v}=e,P=(l,f,a,p=null,h=null,b=null,w=!1,_=null,y=!!f.dynamicChildren)=>{if(l===f)return;l&&!et(l,f)&&(p=pt(l),ye(l,h,b,!0),l=null),f.patchFlag===-2&&(y=!1,f.dynamicChildren=null);const{type:g,ref:O,shapeFlag:E}=f;switch(g){case Fn:T(l,f,a,p);break;case ft:k(l,f,a,p);break;case Vt:l==null&&q(f,a,p,w);break;case pe:ht(l,f,a,p,h,b,w,_,y);break;default:E&1?Kt(l,f,a,p,h,b,w,_,y):E&6?jn(l,f,a,p,h,b,w,_,y):(E&64||E&128)&&g.process(l,f,a,p,h,b,w,_,y,Ke)}O!=null&&h&&cn(O,l&&l.ref,b,f||l,!f)},T=(l,f,a,p)=>{if(l==null)s(f.el=c(f.children),a,p);else{const h=f.el=l.el;f.children!==l.children&&d(h,f.children)}},k=(l,f,a,p)=>{l==null?s(f.el=u(f.children||""),a,p):f.el=l.el},q=(l,f,a,p)=>{[l.el,l.anchor]=v(l.children,f,a,p,l.el,l.anchor)},W=({el:l,anchor:f},a,p)=>{let h;for(;l&&l!==f;)h=C(l),s(l,a,p),l=h;s(f,a,p)},De=({el:l,anchor:f})=>{let a;for(;l&&l!==f;)a=C(l),o(l),l=a;o(f)},Kt=(l,f,a,p,h,b,w,_,y)=>{w=w||f.type==="svg",l==null?Ht(f,a,p,h,b,w,_,y):Xe(l,f,h,b,w,_,y)},Ht=(l,f,a,p,h,b,w,_)=>{let y,g;const{type:O,props:E,shapeFlag:M,transition:I,patchFlag:j,dirs:S}=l;if(l.el&&L!==void 0&&j===-1)y=l.el=L(l.el);else{if(y=l.el=r(l.type,b,E&&E.is,E),M&8?m(y,l.children):M&16&&Me(l.children,y,null,p,h,b&&O!=="foreignObject",w,_),S&&Pe(l,null,p,"created"),E){for(const $ in E)$!=="value"&&!xt($)&&i(y,$,null,E[$],b,l.children,p,h,de);"value"in E&&i(y,"value",null,E.value),(g=E.onVnodeBeforeMount)&&le(g,p,l)}dt(y,l,l.scopeId,w,p)}S&&Pe(l,null,p,"beforeMount");const U=(!h||h&&!h.pendingBranch)&&I&&!I.persisted;U&&I.beforeEnter(y),s(y,f,a),((g=E&&E.onVnodeMounted)||U||S)&&G(()=>{g&&le(g,p,l),U&&I.enter(y),S&&Pe(l,null,p,"mounted")},h)},dt=(l,f,a,p,h)=>{if(a&&A(l,a),p)for(let b=0;b{for(let g=y;g{const _=f.el=l.el;let{patchFlag:y,dynamicChildren:g,dirs:O}=f;y|=l.patchFlag&16;const E=l.props||K,M=f.props||K;let I;a&&Te(a,!1),(I=M.onVnodeBeforeUpdate)&&le(I,a,f,l),O&&Pe(f,l,a,"beforeUpdate"),a&&Te(a,!0);const j=h&&f.type!=="foreignObject";if(g?Ue(l.dynamicChildren,g,_,a,p,j,b):w||ae(l,f,_,null,a,p,j,b,!1),y>0){if(y&16)Ze(_,f,E,M,a,p,h);else if(y&2&&E.class!==M.class&&i(_,"class",null,M.class,h),y&4&&i(_,"style",E.style,M.style,h),y&8){const S=f.dynamicProps;for(let U=0;U{I&&le(I,a,f,l),O&&Pe(f,l,a,"updated")},p)},Ue=(l,f,a,p,h,b,w)=>{for(let _=0;_{if(a!==p){for(const _ in p){if(xt(_))continue;const y=p[_],g=a[_];y!==g&&_!=="value"&&i(l,_,g,y,w,f.children,h,b,de)}if(a!==K)for(const _ in a)!xt(_)&&!(_ in p)&&i(l,_,a[_],null,w,f.children,h,b,de);"value"in p&&i(l,"value",a.value,p.value)}},ht=(l,f,a,p,h,b,w,_,y)=>{const g=f.el=l?l.el:c(""),O=f.anchor=l?l.anchor:c("");let{patchFlag:E,dynamicChildren:M,slotScopeIds:I}=f;I&&(_=_?_.concat(I):I),l==null?(s(g,a,p),s(O,a,p),Me(f.children,a,O,h,b,w,_,y)):E>0&&E&64&&M&&l.dynamicChildren?(Ue(l.dynamicChildren,M,a,h,b,w,_),(f.key!=null||h&&f===h.subTree)&&Gs(l,f,!0)):ae(l,f,a,O,h,b,w,_,y)},jn=(l,f,a,p,h,b,w,_,y)=>{f.slotScopeIds=_,l==null?f.shapeFlag&512?h.ctx.activate(f,a,p,w,y):$t(f,a,p,h,b,w,y):Q(l,f,y)},$t=(l,f,a,p,h,b,w)=>{const _=l.component=dr(l,p,h);if(Bs(l)&&(_.ctx.renderer=Ke),hr(_),_.asyncDep){if(h&&h.registerDep(_,B),!l.el){const y=_.subTree=Re(ft);k(null,y,f,a)}return}B(_,l,f,a,h,b,w)},Q=(l,f,a)=>{const p=f.component=l.component;if(bi(l,f,a))if(p.asyncDep&&!p.asyncResolved){H(p,f,a);return}else p.next=f,ai(p.update),p.update();else f.component=l.component,f.el=l.el,p.vnode=f},B=(l,f,a,p,h,b,w)=>{const _=()=>{if(l.isMounted){let{next:O,bu:E,u:M,parent:I,vnode:j}=l,S=O,U;Te(l,!1),O?(O.el=j.el,H(l,O,w)):O=j,E&&qt(E),(U=O.props&&O.props.onVnodeBeforeUpdate)&&le(U,I,O,j),Te(l,!0);const $=zt(l),se=l.subTree;l.subTree=$,P(se,$,x(se.el),pt(se),l,h,b),O.el=$.el,S===null&&yi(l,$.el),M&&G(M,h),(U=O.props&&O.props.onVnodeUpdated)&&G(()=>le(U,I,O,j),h)}else{let O;const{el:E,props:M}=f,{bm:I,m:j,parent:S}=l,U=sn(f);if(Te(l,!1),I&&qt(I),!U&&(O=M&&M.onVnodeBeforeMount)&&le(O,S,f),Te(l,!0),E&&Wt){const $=()=>{l.subTree=zt(l),Wt(E,l.subTree,l,h,null)};U?f.type.__asyncLoader().then(()=>!l.isUnmounted&&$()):$()}else{const $=l.subTree=zt(l);P(null,$,a,p,l,h,b),f.el=$.el}if(j&&G(j,h),!U&&(O=M&&M.onVnodeMounted)){const $=f;G(()=>le(O,S,$),h)}f.shapeFlag&256&&l.a&&G(l.a,h),l.isMounted=!0,f=a=p=null}},y=l.effect=new xn(_,()=>Rs(l.update),l.scope),g=l.update=y.run.bind(y);g.id=l.uid,Te(l,!0),g()},H=(l,f,a)=>{f.component=l;const p=l.vnode.props;l.vnode=f,l.next=null,Wi(l,f.props,p,a),zi(l,f.children,a),Ye(),In(void 0,l.update),Ve()},ae=(l,f,a,p,h,b,w,_,y=!1)=>{const g=l&&l.children,O=l?l.shapeFlag:0,E=f.children,{patchFlag:M,shapeFlag:I}=f;if(M>0){if(M&128){Qe(g,E,a,p,h,b,w,_,y);return}else if(M&256){St(g,E,a,p,h,b,w,_,y);return}}I&8?(O&16&&de(g,h,b),E!==g&&m(a,E)):O&16?I&16?Qe(g,E,a,p,h,b,w,_,y):de(g,h,b,!0):(O&8&&m(a,""),I&16&&Me(E,a,p,h,b,w,_,y))},St=(l,f,a,p,h,b,w,_,y)=>{l=l||We,f=f||We;const g=l.length,O=f.length,E=Math.min(g,O);let M;for(M=0;MO?de(l,h,b,!0,!1,E):Me(f,a,p,h,b,w,_,y,E)},Qe=(l,f,a,p,h,b,w,_,y)=>{let g=0;const O=f.length;let E=l.length-1,M=O-1;for(;g<=E&&g<=M;){const I=l[g],j=f[g]=y?ve(f[g]):fe(f[g]);if(et(I,j))P(I,j,a,null,h,b,w,_,y);else break;g++}for(;g<=E&&g<=M;){const I=l[E],j=f[M]=y?ve(f[M]):fe(f[M]);if(et(I,j))P(I,j,a,null,h,b,w,_,y);else break;E--,M--}if(g>E){if(g<=M){const I=M+1,j=IM)for(;g<=E;)ye(l[g],h,b,!0),g++;else{const I=g,j=g,S=new Map;for(g=j;g<=M;g++){const ee=f[g]=y?ve(f[g]):fe(f[g]);ee.key!=null&&S.set(ee.key,g)}let U,$=0;const se=M-j+1;let He=!1,Ln=0;const Ge=new Array(se);for(g=0;g=se){ye(ee,h,b,!0);continue}let re;if(ee.key!=null)re=S.get(ee.key);else for(U=j;U<=M;U++)if(Ge[U-j]===0&&et(ee,f[U])){re=U;break}re===void 0?ye(ee,h,b,!0):(Ge[re-j]=g+1,re>=Ln?Ln=re:He=!0,P(ee,f[re],a,null,h,b,w,_,y),$++)}const Kn=He?Zi(Ge):We;for(U=Kn.length-1,g=se-1;g>=0;g--){const ee=j+g,re=f[ee],Hn=ee+1{const{el:b,type:w,transition:_,children:y,shapeFlag:g}=l;if(g&6){Le(l.component.subTree,f,a,p);return}if(g&128){l.suspense.move(f,a,p);return}if(g&64){w.move(l,f,a,Ke);return}if(w===pe){s(b,f,a);for(let E=0;E_.enter(b),h);else{const{leave:E,delayLeave:M,afterLeave:I}=_,j=()=>s(b,f,a),S=()=>{E(b,()=>{j(),I&&I()})};M?M(b,j,S):S()}else s(b,f,a)},ye=(l,f,a,p=!1,h=!1)=>{const{type:b,props:w,ref:_,children:y,dynamicChildren:g,shapeFlag:O,patchFlag:E,dirs:M}=l;if(_!=null&&cn(_,null,a,l,!0),O&256){f.ctx.deactivate(l);return}const I=O&1&&M,j=!sn(l);let S;if(j&&(S=w&&w.onVnodeBeforeUnmount)&&le(S,f,l),O&6)ro(l.component,a,p);else{if(O&128){l.suspense.unmount(a,p);return}I&&Pe(l,null,f,"beforeUnmount"),O&64?l.type.remove(l,f,a,h,Ke,p):g&&(b!==pe||E>0&&E&64)?de(g,f,a,!1,!0):(b===pe&&E&384||!h&&O&16)&&de(y,f,a),p&&Dn(l)}(j&&(S=w&&w.onVnodeUnmounted)||I)&&G(()=>{S&&le(S,f,l),I&&Pe(l,null,f,"unmounted")},a)},Dn=l=>{const{type:f,el:a,anchor:p,transition:h}=l;if(f===pe){io(a,p);return}if(f===Vt){De(l);return}const b=()=>{o(a),h&&!h.persisted&&h.afterLeave&&h.afterLeave()};if(l.shapeFlag&1&&h&&!h.persisted){const{leave:w,delayLeave:_}=h,y=()=>w(a,b);_?_(l.el,b,y):y()}else b()},io=(l,f)=>{let a;for(;l!==f;)a=C(l),o(l),l=a;o(f)},ro=(l,f,a)=>{const{bum:p,scope:h,update:b,subTree:w,um:_}=l;p&&qt(p),h.stop(),b&&(b.active=!1,ye(w,l,f,a)),_&&G(_,f),G(()=>{l.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&l.asyncDep&&!l.asyncResolved&&l.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},de=(l,f,a,p=!1,h=!1,b=0)=>{for(let w=b;wl.shapeFlag&6?pt(l.component.subTree):l.shapeFlag&128?l.suspense.next():C(l.anchor||l.el),Un=(l,f,a)=>{l==null?f._vnode&&ye(f._vnode,null,null,!0):P(f._vnode||null,l,f,null,null,null,a),Us(),f._vnode=l},Ke={p:P,um:ye,m:Le,r:Dn,mt:$t,mc:Me,pc:ae,pbc:Ue,n:pt,o:e};let Bt,Wt;return t&&([Bt,Wt]=t(Ke)),{render:Un,hydrate:Bt,createApp:Yi(Un,Bt)}}function Te({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Gs(e,t,n=!1){const s=e.children,o=t.children;if(N(s)&&N(o))for(let i=0;i>1,e[n[c]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}const Qi=e=>e.__isTeleport,Gi=Symbol(),pe=Symbol(void 0),Fn=Symbol(void 0),ft=Symbol(void 0),Vt=Symbol(void 0),rt=[];let Ne=null;function er(e=!1){rt.push(Ne=e?null:[])}function tr(){rt.pop(),Ne=rt[rt.length-1]||null}let Pt=1;function ss(e){Pt+=e}function nr(e){return e.dynamicChildren=Pt>0?Ne||We:null,tr(),Pt>0&&Ne&&Ne.push(e),e}function sr(e,t,n,s,o,i){return nr(to(e,t,n,s,o,i,!0))}function or(e){return e?e.__v_isVNode===!0:!1}function et(e,t){return e.type===t.type&&e.key===t.key}const Lt="__vInternal",eo=({key:e})=>e!=null?e:null,wt=({ref:e,ref_key:t,ref_for:n})=>e!=null?Y(e)||J(e)||F(e)?{i:me,r:e,k:t,f:!!n}:e:null;function to(e,t=null,n=null,s=0,o=null,i=e===pe?0:1,r=!1,c=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&eo(t),ref:t&&wt(t),scopeId:Hs,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null};return c?(Nn(u,n),i&128&&e.normalize(u)):n&&(u.shapeFlag|=Y(n)?8:16),Pt>0&&!r&&Ne&&(u.patchFlag>0||i&6)&&u.patchFlag!==32&&Ne.push(u),u}const Re=ir;function ir(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===Gi)&&(e=ft),or(e)){const c=ut(e,t,!0);return n&&Nn(c,n),c}if(_r(e)&&(e=e.__vccOpts),t){t=rr(t);let{class:c,style:u}=t;c&&!Y(c)&&(t.class=pn(c)),Z(u)&&(Is(u)&&!N(u)&&(u=X({},u)),t.style=hn(u))}const r=Y(e)?1:xi(e)?128:Qi(e)?64:Z(e)?4:F(e)?2:0;return to(e,t,n,s,o,r,i,!0)}function rr(e){return e?Is(e)||Lt in e?X({},e):e:null}function ut(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,c=t?cr(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&eo(c),ref:t&&t.ref?n&&o?N(o)?o.concat(wt(t)):[o,wt(t)]:wt(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==pe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ut(e.ssContent),ssFallback:e.ssFallback&&ut(e.ssFallback),el:e.el,anchor:e.anchor}}function lr(e=" ",t=0){return Re(Fn,null,e,t)}function fe(e){return e==null||typeof e=="boolean"?Re(ft):N(e)?Re(pe,null,e.slice()):typeof e=="object"?ve(e):Re(Fn,null,String(e))}function ve(e){return e.el===null||e.memo?e:ut(e)}function Nn(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),Nn(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Lt in t)?t._ctx=me:o===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else F(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[lr(t)]):n=8);e.children=t,e.shapeFlag|=n}function cr(...e){const t={};for(let n=0;ne?no(e)?Rn(e)||e.proxy:fn(e.parent):null,Tt=X(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>fn(e.parent),$root:e=>fn(e.root),$emit:e=>e.emit,$options:e=>zs(e),$forceUpdate:e=>()=>Rs(e.update),$nextTick:e=>fi.bind(e.proxy),$watch:e=>Ci.bind(e)}),fr={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:c,appContext:u}=e;let d;if(t[0]!=="$"){const A=r[t];if(A!==void 0)switch(A){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(s!==K&&R(s,t))return r[t]=1,s[t];if(o!==K&&R(o,t))return r[t]=2,o[t];if((d=e.propsOptions[0])&&R(d,t))return r[t]=3,i[t];if(n!==K&&R(n,t))return r[t]=4,n[t];on&&(r[t]=0)}}const m=Tt[t];let x,C;if(m)return t==="$attrs"&&ne(e,"get",t),m(e);if((x=c.__cssModules)&&(x=x[t]))return x;if(n!==K&&R(n,t))return r[t]=4,n[t];if(C=u.config.globalProperties,R(C,t))return C[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return o!==K&&R(o,t)?(o[t]=n,!0):s!==K&&R(s,t)?(s[t]=n,!0):R(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let c;return!!n[r]||e!==K&&R(e,r)||t!==K&&R(t,r)||(c=i[0])&&R(c,r)||R(s,r)||R(Tt,r)||R(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e.$.accessCache[t]=0:R(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},ur=Qs();let ar=0;function dr(e,t,n){const s=e.type,o=(t?t.appContext:e.appContext)||ur,i={uid:ar++,vnode:e,type:s,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new To(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ys(s,o),emitsOptions:Ks(s,o),emit:null,emitted:null,propsDefaults:K,inheritAttrs:s.inheritAttrs,ctx:K,data:K,props:K,attrs:K,slots:K,refs:K,setupState:K,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=pi.bind(null,i),e.ce&&e.ce(i),i}let z=null;const ze=e=>{z=e,e.scope.on()},je=()=>{z&&z.scope.off(),z=null};function no(e){return e.vnode.shapeFlag&4}let at=!1;function hr(e,t=!1){at=t;const{props:n,children:s}=e.vnode,o=no(e);Bi(e,n,o,t),qi(e,s);const i=o?pr(e,t):void 0;return at=!1,i}function pr(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=As(new Proxy(e.ctx,fr));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?mr(e):null;ze(e),Ye();const i=Ee(s,e,0,[e.props,o]);if(Ve(),je(),gs(i)){if(i.then(je,je),t)return i.then(r=>{os(e,r,t)}).catch(r=>{jt(r,e,0)});e.asyncDep=i}else os(e,i,t)}else so(e,t)}function os(e,t,n){F(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Fs(t)),so(e,n)}let is;function so(e,t,n){const s=e.type;if(!e.render){if(!t&&is&&!s.render){const o=s.template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:c,compilerOptions:u}=s,d=X(X({isCustomElement:i,delimiters:c},r),u);s.render=is(o,d)}}e.render=s.render||oe}ze(e),Ye(),Li(e),Ve(),je()}function gr(e){return new Proxy(e.attrs,{get(t,n){return ne(e,"get","$attrs"),t[n]}})}function mr(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=gr(e))},slots:e.slots,emit:e.emit,expose:t}}function Rn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Fs(As(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Tt)return Tt[n](e)}}))}function _r(e){return F(e)&&"__vccOpts"in e}const br=(e,t)=>li(e,t,at),yr="3.2.32",xr="http://www.w3.org/2000/svg",Ae=typeof document!="undefined"?document:null,rs=Ae&&Ae.createElement("template"),wr={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?Ae.createElementNS(xr,e):Ae.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>Ae.createTextNode(e),createComment:e=>Ae.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ae.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{rs.innerHTML=s?`${e}`:e;const c=rs.content;if(s){const u=c.firstChild;for(;u.firstChild;)c.appendChild(u.firstChild);c.removeChild(u)}t.insertBefore(c,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function vr(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Cr(e,t,n){const s=e.style,o=Y(n);if(n&&!o){for(const i in n)un(s,i,n[i]);if(t&&!Y(t))for(const i in t)n[i]==null&&un(s,i,"")}else{const i=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const ls=/\s*!important$/;function un(e,t,n){if(N(n))n.forEach(s=>un(e,t,s));else if(t.startsWith("--"))e.setProperty(t,n);else{const s=Er(e,t);ls.test(n)?e.setProperty(Je(s),n.replace(ls,""),"important"):e[s]=n}}const cs=["Webkit","Moz","ms"],Xt={};function Er(e,t){const n=Xt[t];if(n)return n;let s=qe(t);if(s!=="filter"&&s in e)return Xt[t]=s;s=ms(s);for(let o=0;odocument.createEvent("Event").timeStamp&&(It=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);oo=!!(e&&Number(e[1])<=53)}let an=0;const Pr=Promise.resolve(),Tr=()=>{an=0},Ir=()=>an||(Pr.then(Tr),an=It());function Ar(e,t,n,s){e.addEventListener(t,n,s)}function Fr(e,t,n,s){e.removeEventListener(t,n,s)}function Nr(e,t,n,s,o=null){const i=e._vei||(e._vei={}),r=i[t];if(s&&r)r.value=s;else{const[c,u]=Rr(t);if(s){const d=i[t]=jr(s,o);Ar(e,c,d,u)}else r&&(Fr(e,c,r,u),i[t]=void 0)}}const us=/(?:Once|Passive|Capture)$/;function Rr(e){let t;if(us.test(e)){t={};let n;for(;n=e.match(us);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[Je(e.slice(2)),t]}function jr(e,t){const n=s=>{const o=s.timeStamp||It();(oo||o>=n.attached-1)&&ie(Dr(s,n.value),t,5,[s])};return n.value=e,n.attached=Ir(),n}function Dr(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const as=/^on[a-z]/,Ur=(e,t,n,s,o=!1,i,r,c,u)=>{t==="class"?vr(e,s,o):t==="style"?Cr(e,n,s):At(t)?gn(t)||Nr(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Lr(e,t,s,o))?Mr(e,t,s,i,r,c,u):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Or(e,t,s,o))};function Lr(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&as.test(t)&&F(n)):t==="spellcheck"||t==="draggable"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||as.test(t)&&Y(n)?!1:t in e}const Kr=X({patchProp:Ur},wr);let ds;function Hr(){return ds||(ds=Vi(Kr))}const $r=(...e)=>{const t=Hr().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Sr(s);if(!o)return;const i=t._component;!F(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.innerHTML="";const r=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),r},t};function Sr(e){return Y(e)?document.querySelector(e):e}function Br(e=null){const t=(e==null?void 0:e.border_radius)||2,n=(e==null?void 0:e.radius)||12,s=(e==null?void 0:e.color)||"#ccc",o=(e==null?void 0:e.border_color)||"#fff",i=document.createElement("canvas");i.width=n*2+t*2,i.height=n*2+t*2;const r=i.getContext("2d");return r.fillStyle=s,r.strokeStyle=o,r.lineWidth=t,r.beginPath(),r.arc(n+t,n+t,n,0,2*Math.PI),r.closePath(),r.fill(),r.stroke(),{surface:i,radius:n,border_radius:t}}function Wr(e,t,n){e.drawImage(t.surface,n.x-t.radius-t.border_radius,n.y-t.radius-t.border_radius)}function hs(e,t){const{x:n,y:s}=e,{x:o,y:i}=t;return Math.sqrt(Math.pow(n-o,2)+Math.pow(s-i,2))}const kr={drag_point:null,connect_point:null,drag_offset:null,mouse:null,drag_all_offsets:null},qr={onMouseDown(e){e.preventDefault(),this.updateMousePosition(e);let t=this.nodes.find(n=>hs(n.position,this.mouse)s.from!=n&&s.to!=n),this.keys.Control||(this.nodes.splice(n,1),this.connections=this.connections.map(s=>(s.from>n&&s.from--,s.to>n&&s.to--,s))),this.save(),this.update_colors(),this.draw()}break}else if(e.button==0)t={circle:this.circles[0],position:this.mouse},this.drag_offset={x:0,y:0},t.position.x=this.mouse.x,t.position.y=this.mouse.y,this.nodes.push(t),this.save(),this.update_colors(),this.draw(),this.drag_point=t;else if(e.button==1)t={circle:this.circles[0],position:this.mouse},this.nodes.push(t),this.connect_point=t;else if(e.button==2){this.drag_all_offsets=[];for(const n of this.nodes)this.drag_all_offsets.push({x:n.position.x-this.mouse.x,y:n.position.y-this.mouse.y})}},onMouseMove(e){if(this.updateMousePosition(e),this.drag_point&&(this.drag_point.position.x=this.mouse.x+this.drag_offset.x,this.drag_point.position.y=this.mouse.y+this.drag_offset.y,this.draw()),this.connect_point&&this.draw(),this.drag_all_offsets){for(let t=0;ths(n.position,this.mouse)o.from==n&&o.to==s||o.to==n&&o.from==s)&&(this.connections.push({from:n,to:s}),this.update_colors())}else{const n={circle:this.circles[0],position:this.mouse};this.nodes.push(n),this.connections.push({from:this.nodes.indexOf(this.connect_point),to:this.nodes.indexOf(n)}),this.update_colors()}}this.drag_point=null,this.connect_point=null,this.drag_all_offsets=null,this.save(),this.draw()},updateMousePosition(e){this.screen.focus();const{offsetX:t,offsetY:n}=e;this.mouse={x:t,y:n}}},zr={keys:{}},Jr={onKeyDown(e){if(this.keys[e.key]=!0,e.ctrlKey){if(e.key=="s"){e.preventDefault(),e.stopPropagation();const t=new File([JSON.stringify({nodes:this.nodes.map(s=>s.position),connections:this.connections})],"save.json",{type:"application/json"}),n=document.createElement("a");n.href=URL.createObjectURL(t),n.download="graph.json",n.click(),n.remove(),this.keys.Control=!1,this.keys[e.key]=!1}if(e.key=="l"){e.preventDefault(),e.stopPropagation();const t=document.createElement("input");t.type="file",t.accept="application/json",t.onchange=n=>{const s=n.target.files[0],o=new FileReader;o.onload=i=>{const{connections:r,nodes:c}=JSON.parse(o.result);this.connections=r,this.nodes=c,this.parse_saved_nodes(),this.update_colors(),this.save(),this.draw()},o.readAsText(s)},t.click(),t.remove(),this.keys.Control=!1,this.keys[e.key]=!1}e.key=="c"&&(e.preventDefault(),e.stopPropagation(),this.connections=[],this.nodes=[],this.save(),this.draw(),this.keys.Control=!1,this.keys[e.key]=!1)}},onKeyUp(e){this.keys[e.key]=!1}},Yr={screen:null,circles:[],nodes:[],connections:[],lines:[],style:null,node_odd_count:[]},Vr={draw(){const e=this.screen.getContext("2d");e.clearRect(0,0,this.screen.width,this.screen.height),this.connect_point&&this.draw_line(e,this.connect_point.position,this.mouse);for(const t of this.connections)this.draw_line(e,this.nodes[t.from].position,this.nodes[t.to].position);for(const t of this.nodes)Wr(e,t.circle,t.position),e.fillStyle="white",e.textAlign="center"},draw_line(e,t,n){e.beginPath(),e.moveTo(t.x,t.y),e.lineTo(n.x,n.y),e.lineWidth=7,e.strokeStyle=this.style.getPropertyValue("--bright"),e.stroke(),e.lineWidth=3,e.strokeStyle=this.style.getPropertyValue("--medium"),e.stroke()},update_colors(){const e=this.solve();for(let t=0;te.position))),localStorage.setItem("connections",JSON.stringify(this.connections))},load(){this.nodes=JSON.parse(window.localStorage.getItem("nodes"))||[],this.parse_saved_nodes(),this.connections=JSON.parse(window.localStorage.getItem("connections"))||[],this.update_colors()},parse_saved_nodes(){this.nodes=this.nodes.map(e=>({position:e}))}},Zr={solve(){let e=[];const t=[];for(let v=0;v2){var q=[...T].sort().join(",");T.length%2==1&&(o.has(q)||(o.add(q),s.push([...T])))}}function r(){const v=Array(t.length).fill(0);for(const P of s)for(const T of P)v[T]++;return v}var c=r();const u=Array(t.length).fill(0).map(v=>[]);for(var d=0;dc[P]-c[v]);for(const v of n)v.sort((P,T)=>c[T]-c[P])}m();let x=0,C=!0;const A=Array(t.length).fill(!1);function L(){for(var v=0;v{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n};const Gr=Ei({name:"App",mounted(){this.screen=this.$refs.screen,this.screen.width=window.innerWidth,this.screen.height=window.innerHeight,this.style=getComputedStyle(this.screen),this.screen.focus();const e=["red","green","blue","yellow","orange","purple","pink","brown","black","white","gray","lime","cyan","magenta","olive","maroon","navy","teal","silver","indigo","violet"];for(const t of e)this.circles.push(Br({color:t,border_color:this.style.getPropertyValue("--bright"),radius:15}));this.load(),this.draw()},data(){return he(he(he({},Yr),kr),zr)},methods:he(he(he(he(he({},qr),Jr),Vr),Xr),Zr)});function el(e,t,n,s,o,i){return er(),sr("canvas",{ref:"screen",onMousedown:t[0]||(t[0]=(...r)=>e.onMouseDown&&e.onMouseDown(...r)),onMousemove:t[1]||(t[1]=(...r)=>e.onMouseMove&&e.onMouseMove(...r)),onMouseup:t[2]||(t[2]=(...r)=>e.onMouseUp&&e.onMouseUp(...r)),onKeydown:t[3]||(t[3]=(...r)=>e.onKeyDown&&e.onKeyDown(...r)),onKeyup:t[4]||(t[4]=(...r)=>e.onKeyUp&&e.onKeyUp(...r)),onContextmenu:t[5]||(t[5]=r=>r.preventDefault()),tabindex:"0"},null,544)}var tl=Qr(Gr,[["render",el],["__scopeId","data-v-07cf37a2"]]);$r(tl).mount("#app"); 2 | -------------------------------------------------------------------------------- /dist/assets/index.8274c96c.css: -------------------------------------------------------------------------------- 1 | canvas[data-v-07cf37a2]{position:absolute;top:0;left:0}canvas[data-v-07cf37a2]:focus{outline:none}*{--dark-selection:rgb(20, 25, 34);--dark:rgb(24, 24, 24);--medium:rgb(36, 36, 36);--bright:rgb(85, 85, 85)}body{background-color:var(--dark);color:#fff}:root{color-scheme:dark}.icon{filter:invert(1)}body{overflow:hidden}input.form-control{background-color:var(--dark);border:1px solid var(--bright);color:#fff}input.form-control:focus{border:1px solid var(--bright);background-color:var(--dark);color:#fff} 2 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Graph coloring 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /examples/ex1.json: -------------------------------------------------------------------------------- 1 | {"nodes":[{"x":91,"y":197},{"x":171,"y":56},{"x":375,"y":92},{"x":153,"y":330},{"x":297,"y":274},{"x":446,"y":213}],"connections":[{"from":0,"to":1},{"from":1,"to":2},{"from":0,"to":2},{"from":0,"to":3},{"from":3,"to":4},{"from":4,"to":5},{"from":5,"to":2}],"selected":[0,5,1,3,2,4],"colorHistory":[[0,1,1,1,0,0],[0,1,1,1,1,0],[0,1,2,1,1,0],[0,1,2,1,2,0],[0,1,2,1,2,0],[0,1,2,1,2,0]]} -------------------------------------------------------------------------------- /examples/ex2.json: -------------------------------------------------------------------------------- 1 | {"nodes":[{"x":212,"y":57},{"x":327,"y":39},{"x":417,"y":102},{"x":372,"y":215},{"x":291,"y":131},{"x":261,"y":233},{"x":73,"y":191},{"x":164,"y":240},{"x":224,"y":326},{"x":130,"y":415},{"x":298,"y":412}],"connections":[{"from":0,"to":1},{"from":1,"to":2},{"from":2,"to":3},{"from":3,"to":4},{"from":4,"to":5},{"from":5,"to":3},{"from":4,"to":1},{"from":4,"to":0},{"from":0,"to":6},{"from":6,"to":4},{"from":6,"to":7},{"from":7,"to":5},{"from":5,"to":8},{"from":8,"to":7},{"from":8,"to":9},{"from":9,"to":10},{"from":10,"to":8},{"from":4,"to":2},{"from":10,"to":3},{"from":9,"to":6}],"selected":[4,10,7,3,1,6,8,0,2,5,9],"colorHistory":[[1,1,1,1,0,1,1,0,0,0,0],[1,1,1,1,0,1,1,0,1,1,0],[1,1,1,1,0,1,1,0,1,1,0],[1,1,2,1,0,2,1,0,1,1,0],[2,1,2,1,0,2,1,0,1,1,0],[2,1,2,1,0,2,1,0,1,2,0],[2,1,2,1,0,2,1,0,1,2,0],[2,1,2,1,0,2,1,0,1,2,0],[2,1,2,1,0,2,1,0,1,2,0],[2,1,2,1,0,2,1,0,1,2,0],[2,1,2,1,0,2,1,0,1,2,0]]} -------------------------------------------------------------------------------- /examples/ex3.json: -------------------------------------------------------------------------------- 1 | {"nodes":[{"x":276,"y":126},{"x":391,"y":108},{"x":481,"y":171},{"x":436,"y":284},{"x":355,"y":200},{"x":325,"y":302},{"x":137,"y":260},{"x":228,"y":309},{"x":288,"y":395},{"x":194,"y":484},{"x":362,"y":481},{"x":554,"y":141},{"x":427,"y":39},{"x":250,"y":56},{"x":55,"y":240},{"x":129,"y":557},{"x":510,"y":312},{"x":441,"y":548}],"connections":[{"from":0,"to":1},{"from":1,"to":2},{"from":2,"to":3},{"from":3,"to":4},{"from":4,"to":5},{"from":5,"to":3},{"from":4,"to":1},{"from":4,"to":0},{"from":0,"to":6},{"from":6,"to":4},{"from":6,"to":7},{"from":7,"to":5},{"from":5,"to":8},{"from":8,"to":7},{"from":8,"to":9},{"from":9,"to":10},{"from":10,"to":8},{"from":4,"to":2},{"from":10,"to":3},{"from":9,"to":6},{"from":2,"to":11},{"from":11,"to":12},{"from":12,"to":1},{"from":12,"to":13},{"from":13,"to":0},{"from":13,"to":14},{"from":14,"to":6},{"from":14,"to":15},{"from":15,"to":9},{"from":16,"to":3},{"from":16,"to":11},{"from":15,"to":17},{"from":17,"to":10},{"from":17,"to":16}],"selected":[4,10,7,15,13,11,3,1,6,8,17,0,2,5,9,12,14,16],"colorHistory":[[1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,1],[1,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,1],[1,1,1,1,0,1,1,0,1,1,0,0,0,0,1,0,0,1],[1,1,1,1,0,1,1,0,1,1,0,0,1,0,1,0,0,1],[1,1,1,1,0,1,1,0,1,1,0,0,1,0,1,0,1,1],[1,1,2,1,0,2,1,0,1,1,0,0,1,0,1,0,2,1],[2,1,2,1,0,2,1,0,1,1,0,0,2,0,1,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1],[2,1,2,1,0,2,1,0,1,2,0,0,2,0,2,0,2,1]]} -------------------------------------------------------------------------------- /examples/ex4.json: -------------------------------------------------------------------------------- 1 | {"nodes":[{"x":77,"y":148},{"x":170,"y":43},{"x":288,"y":137},{"x":316,"y":320},{"x":65,"y":335},{"x":179,"y":212}],"connections":[{"from":0,"to":1},{"from":1,"to":2},{"from":2,"to":3},{"from":3,"to":4},{"from":4,"to":0},{"from":3,"to":5},{"from":5,"to":2},{"from":5,"to":4}],"selected":[2,4,3,0,1,5],"colorHistory":[[0,1,0,1,0,1],[1,1,0,1,0,1],[1,1,0,1,0,2],[1,2,0,1,0,2],[1,2,0,1,0,2],[1,2,0,1,0,2]]} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Graph coloring 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graph", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "graph", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "path": "^0.12.7", 12 | "vue": "^3.2.25" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^2.3.0", 16 | "typescript": "^4.5.4", 17 | "vite": "^2.9.0", 18 | "vue-tsc": "^0.29.8" 19 | } 20 | }, 21 | "node_modules/@babel/helper-validator-identifier": { 22 | "version": "7.16.7", 23 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 24 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 25 | "dev": true, 26 | "engines": { 27 | "node": ">=6.9.0" 28 | } 29 | }, 30 | "node_modules/@babel/parser": { 31 | "version": "7.17.9", 32 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", 33 | "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", 34 | "bin": { 35 | "parser": "bin/babel-parser.js" 36 | }, 37 | "engines": { 38 | "node": ">=6.0.0" 39 | } 40 | }, 41 | "node_modules/@babel/types": { 42 | "version": "7.17.0", 43 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", 44 | "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", 45 | "dev": true, 46 | "dependencies": { 47 | "@babel/helper-validator-identifier": "^7.16.7", 48 | "to-fast-properties": "^2.0.0" 49 | }, 50 | "engines": { 51 | "node": ">=6.9.0" 52 | } 53 | }, 54 | "node_modules/@emmetio/abbreviation": { 55 | "version": "2.2.3", 56 | "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.2.3.tgz", 57 | "integrity": "sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==", 58 | "dev": true, 59 | "dependencies": { 60 | "@emmetio/scanner": "^1.0.0" 61 | } 62 | }, 63 | "node_modules/@emmetio/css-abbreviation": { 64 | "version": "2.1.4", 65 | "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz", 66 | "integrity": "sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw==", 67 | "dev": true, 68 | "dependencies": { 69 | "@emmetio/scanner": "^1.0.0" 70 | } 71 | }, 72 | "node_modules/@emmetio/scanner": { 73 | "version": "1.0.0", 74 | "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.0.tgz", 75 | "integrity": "sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==", 76 | "dev": true 77 | }, 78 | "node_modules/@vitejs/plugin-vue": { 79 | "version": "2.3.1", 80 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.1.tgz", 81 | "integrity": "sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ==", 82 | "dev": true, 83 | "engines": { 84 | "node": ">=12.0.0" 85 | }, 86 | "peerDependencies": { 87 | "vite": "^2.5.10", 88 | "vue": "^3.2.25" 89 | } 90 | }, 91 | "node_modules/@volar/code-gen": { 92 | "version": "0.29.8", 93 | "resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.29.8.tgz", 94 | "integrity": "sha512-eohLLUqPChHRPDFT5gXn4V6pr/CeTri7Ou5GI26lUvBRRAbP8p+oYfQRcbMPGeKmVkYjfVj0chsxQGx6T8PQ4Q==", 95 | "dev": true, 96 | "dependencies": { 97 | "@volar/shared": "0.29.8", 98 | "@volar/source-map": "0.29.8" 99 | } 100 | }, 101 | "node_modules/@volar/html2pug": { 102 | "version": "0.29.8", 103 | "resolved": "https://registry.npmjs.org/@volar/html2pug/-/html2pug-0.29.8.tgz", 104 | "integrity": "sha512-bhSNXg8A2aD3w0B+CwmHjqCAaKtj5rORbE5C/q/UdGqptJbC6STCmi30KuRTdfPhR++Xb18Hauf3s/WCmtNAPA==", 105 | "deprecated": "WARNING: This project has been renamed to @johnsoncodehk/html2pug. Install using @johnsoncodehk/html2pug instead.", 106 | "dev": true, 107 | "dependencies": { 108 | "domelementtype": "^2.2.0", 109 | "domhandler": "^4.2.2", 110 | "htmlparser2": "^7.1.2", 111 | "pug": "^3.0.2" 112 | } 113 | }, 114 | "node_modules/@volar/shared": { 115 | "version": "0.29.8", 116 | "resolved": "https://registry.npmjs.org/@volar/shared/-/shared-0.29.8.tgz", 117 | "integrity": "sha512-Y1NN6irkIukD+T0wf4p/dHWYL90sacN2e2lYoDXxRlvoYxwANnHgw0J0Rcp+yw58ElWRScdG7/YntEIuZWeJsw==", 118 | "dev": true, 119 | "dependencies": { 120 | "upath": "^2.0.1", 121 | "vscode-jsonrpc": "^8.0.0-next.2", 122 | "vscode-uri": "^3.0.2" 123 | } 124 | }, 125 | "node_modules/@volar/source-map": { 126 | "version": "0.29.8", 127 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.29.8.tgz", 128 | "integrity": "sha512-7w+UoYtnc6UQu30CgMVvx0YN4dzDgP4TIsSmUaW62AGmxU9Lxwp3Kkn/4N8efi91z8ma5Z78v/HddyJPwAC3LA==", 129 | "dev": true, 130 | "dependencies": { 131 | "@volar/shared": "0.29.8" 132 | } 133 | }, 134 | "node_modules/@volar/transforms": { 135 | "version": "0.29.8", 136 | "resolved": "https://registry.npmjs.org/@volar/transforms/-/transforms-0.29.8.tgz", 137 | "integrity": "sha512-o2hRa8CoDwYTO1Mu5KA47+1elUnYUjDaVhCvbyKlRfd8qpHea2llotArq7B6OORSL2M9DVs1IRJ5NGURBFeZ3Q==", 138 | "dev": true, 139 | "dependencies": { 140 | "@volar/shared": "0.29.8", 141 | "vscode-languageserver": "^8.0.0-next.2" 142 | } 143 | }, 144 | "node_modules/@volar/vue-code-gen": { 145 | "version": "0.29.8", 146 | "resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.29.8.tgz", 147 | "integrity": "sha512-E1e7P2oktNC/DzgDBditfla4s8+HlUlluZ+BtcLvEdbkl3QEjujkB0x1wxguWzXmpWgLIDPtrS3Jzll5cCOkTg==", 148 | "dev": true, 149 | "dependencies": { 150 | "@volar/code-gen": "0.29.8", 151 | "@volar/shared": "0.29.8", 152 | "@volar/source-map": "0.29.8", 153 | "@vue/compiler-core": "^3.2.21", 154 | "@vue/compiler-dom": "^3.2.21", 155 | "@vue/shared": "^3.2.21", 156 | "upath": "^2.0.1" 157 | } 158 | }, 159 | "node_modules/@vscode/emmet-helper": { 160 | "version": "2.8.4", 161 | "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.8.4.tgz", 162 | "integrity": "sha512-lUki5QLS47bz/U8IlG9VQ+1lfxMtxMZENmU5nu4Z71eOD5j9FK0SmYGL5NiVJg9WBWeAU0VxRADMY2Qpq7BfVg==", 163 | "dev": true, 164 | "dependencies": { 165 | "emmet": "^2.3.0", 166 | "jsonc-parser": "^2.3.0", 167 | "vscode-languageserver-textdocument": "^1.0.1", 168 | "vscode-languageserver-types": "^3.15.1", 169 | "vscode-nls": "^5.0.0", 170 | "vscode-uri": "^2.1.2" 171 | } 172 | }, 173 | "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": { 174 | "version": "2.1.2", 175 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", 176 | "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", 177 | "dev": true 178 | }, 179 | "node_modules/@vue/compiler-core": { 180 | "version": "3.2.32", 181 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.32.tgz", 182 | "integrity": "sha512-bRQ8Rkpm/aYFElDWtKkTPHeLnX5pEkNxhPUcqu5crEJIilZH0yeFu/qUAcV4VfSE2AudNPkQSOwMZofhnuutmA==", 183 | "dependencies": { 184 | "@babel/parser": "^7.16.4", 185 | "@vue/shared": "3.2.32", 186 | "estree-walker": "^2.0.2", 187 | "source-map": "^0.6.1" 188 | } 189 | }, 190 | "node_modules/@vue/compiler-dom": { 191 | "version": "3.2.32", 192 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.32.tgz", 193 | "integrity": "sha512-maa3PNB/NxR17h2hDQfcmS02o1f9r9QIpN1y6fe8tWPrS1E4+q8MqrvDDQNhYVPd84rc3ybtyumrgm9D5Rf/kg==", 194 | "dependencies": { 195 | "@vue/compiler-core": "3.2.32", 196 | "@vue/shared": "3.2.32" 197 | } 198 | }, 199 | "node_modules/@vue/compiler-sfc": { 200 | "version": "3.2.32", 201 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.32.tgz", 202 | "integrity": "sha512-uO6+Gh3AVdWm72lRRCjMr8nMOEqc6ezT9lWs5dPzh1E9TNaJkMYPaRtdY9flUv/fyVQotkfjY/ponjfR+trPSg==", 203 | "dependencies": { 204 | "@babel/parser": "^7.16.4", 205 | "@vue/compiler-core": "3.2.32", 206 | "@vue/compiler-dom": "3.2.32", 207 | "@vue/compiler-ssr": "3.2.32", 208 | "@vue/reactivity-transform": "3.2.32", 209 | "@vue/shared": "3.2.32", 210 | "estree-walker": "^2.0.2", 211 | "magic-string": "^0.25.7", 212 | "postcss": "^8.1.10", 213 | "source-map": "^0.6.1" 214 | } 215 | }, 216 | "node_modules/@vue/compiler-ssr": { 217 | "version": "3.2.32", 218 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.32.tgz", 219 | "integrity": "sha512-ZklVUF/SgTx6yrDUkaTaBL/JMVOtSocP+z5Xz/qIqqLdW/hWL90P+ob/jOQ0Xc/om57892Q7sRSrex0wujOL2Q==", 220 | "dependencies": { 221 | "@vue/compiler-dom": "3.2.32", 222 | "@vue/shared": "3.2.32" 223 | } 224 | }, 225 | "node_modules/@vue/reactivity": { 226 | "version": "3.2.32", 227 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.32.tgz", 228 | "integrity": "sha512-4zaDumuyDqkuhbb63hRd+YHFGopW7srFIWesLUQ2su/rJfWrSq3YUvoKAJE8Eu1EhZ2Q4c1NuwnEreKj1FkDxA==", 229 | "dependencies": { 230 | "@vue/shared": "3.2.32" 231 | } 232 | }, 233 | "node_modules/@vue/reactivity-transform": { 234 | "version": "3.2.32", 235 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.32.tgz", 236 | "integrity": "sha512-CW1W9zaJtE275tZSWIfQKiPG0iHpdtSlmTqYBu7Y62qvtMgKG5yOxtvBs4RlrZHlaqFSE26avLAgQiTp4YHozw==", 237 | "dependencies": { 238 | "@babel/parser": "^7.16.4", 239 | "@vue/compiler-core": "3.2.32", 240 | "@vue/shared": "3.2.32", 241 | "estree-walker": "^2.0.2", 242 | "magic-string": "^0.25.7" 243 | } 244 | }, 245 | "node_modules/@vue/runtime-core": { 246 | "version": "3.2.32", 247 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.32.tgz", 248 | "integrity": "sha512-uKKzK6LaCnbCJ7rcHvsK0azHLGpqs+Vi9B28CV1mfWVq1F3Bj8Okk3cX+5DtD06aUh4V2bYhS2UjjWiUUKUF0w==", 249 | "dependencies": { 250 | "@vue/reactivity": "3.2.32", 251 | "@vue/shared": "3.2.32" 252 | } 253 | }, 254 | "node_modules/@vue/runtime-dom": { 255 | "version": "3.2.32", 256 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.32.tgz", 257 | "integrity": "sha512-AmlIg+GPqjkNoADLjHojEX5RGcAg+TsgXOOcUrtDHwKvA8mO26EnLQLB8nylDjU6AMJh2CIYn8NEgyOV5ZIScQ==", 258 | "dependencies": { 259 | "@vue/runtime-core": "3.2.32", 260 | "@vue/shared": "3.2.32", 261 | "csstype": "^2.6.8" 262 | } 263 | }, 264 | "node_modules/@vue/server-renderer": { 265 | "version": "3.2.32", 266 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.32.tgz", 267 | "integrity": "sha512-TYKpZZfRJpGTTiy/s6bVYwQJpAUx3G03z4G7/3O18M11oacrMTVHaHjiPuPqf3xQtY8R4LKmQ3EOT/DRCA/7Wg==", 268 | "dependencies": { 269 | "@vue/compiler-ssr": "3.2.32", 270 | "@vue/shared": "3.2.32" 271 | }, 272 | "peerDependencies": { 273 | "vue": "3.2.32" 274 | } 275 | }, 276 | "node_modules/@vue/shared": { 277 | "version": "3.2.32", 278 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.32.tgz", 279 | "integrity": "sha512-bjcixPErUsAnTQRQX4Z5IQnICYjIfNCyCl8p29v1M6kfVzvwOICPw+dz48nNuWlTOOx2RHhzHdazJibE8GSnsw==" 280 | }, 281 | "node_modules/acorn": { 282 | "version": "7.4.1", 283 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 284 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 285 | "dev": true, 286 | "bin": { 287 | "acorn": "bin/acorn" 288 | }, 289 | "engines": { 290 | "node": ">=0.4.0" 291 | } 292 | }, 293 | "node_modules/asap": { 294 | "version": "2.0.6", 295 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 296 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 297 | "dev": true 298 | }, 299 | "node_modules/assert-never": { 300 | "version": "1.2.1", 301 | "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", 302 | "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", 303 | "dev": true 304 | }, 305 | "node_modules/babel-walk": { 306 | "version": "3.0.0-canary-5", 307 | "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", 308 | "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", 309 | "dev": true, 310 | "dependencies": { 311 | "@babel/types": "^7.9.6" 312 | }, 313 | "engines": { 314 | "node": ">= 10.0.0" 315 | } 316 | }, 317 | "node_modules/call-bind": { 318 | "version": "1.0.2", 319 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 320 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 321 | "dev": true, 322 | "dependencies": { 323 | "function-bind": "^1.1.1", 324 | "get-intrinsic": "^1.0.2" 325 | }, 326 | "funding": { 327 | "url": "https://github.com/sponsors/ljharb" 328 | } 329 | }, 330 | "node_modules/character-parser": { 331 | "version": "2.2.0", 332 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", 333 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", 334 | "dev": true, 335 | "dependencies": { 336 | "is-regex": "^1.0.3" 337 | } 338 | }, 339 | "node_modules/constantinople": { 340 | "version": "4.0.1", 341 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", 342 | "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", 343 | "dev": true, 344 | "dependencies": { 345 | "@babel/parser": "^7.6.0", 346 | "@babel/types": "^7.6.1" 347 | } 348 | }, 349 | "node_modules/csstype": { 350 | "version": "2.6.20", 351 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", 352 | "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" 353 | }, 354 | "node_modules/doctypes": { 355 | "version": "1.1.0", 356 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", 357 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", 358 | "dev": true 359 | }, 360 | "node_modules/dom-serializer": { 361 | "version": "1.4.1", 362 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 363 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 364 | "dev": true, 365 | "dependencies": { 366 | "domelementtype": "^2.0.1", 367 | "domhandler": "^4.2.0", 368 | "entities": "^2.0.0" 369 | }, 370 | "funding": { 371 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 372 | } 373 | }, 374 | "node_modules/dom-serializer/node_modules/entities": { 375 | "version": "2.2.0", 376 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 377 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 378 | "dev": true, 379 | "funding": { 380 | "url": "https://github.com/fb55/entities?sponsor=1" 381 | } 382 | }, 383 | "node_modules/domelementtype": { 384 | "version": "2.3.0", 385 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 386 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 387 | "dev": true, 388 | "funding": [ 389 | { 390 | "type": "github", 391 | "url": "https://github.com/sponsors/fb55" 392 | } 393 | ] 394 | }, 395 | "node_modules/domhandler": { 396 | "version": "4.3.1", 397 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 398 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 399 | "dev": true, 400 | "dependencies": { 401 | "domelementtype": "^2.2.0" 402 | }, 403 | "engines": { 404 | "node": ">= 4" 405 | }, 406 | "funding": { 407 | "url": "https://github.com/fb55/domhandler?sponsor=1" 408 | } 409 | }, 410 | "node_modules/domutils": { 411 | "version": "2.8.0", 412 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 413 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 414 | "dev": true, 415 | "dependencies": { 416 | "dom-serializer": "^1.0.1", 417 | "domelementtype": "^2.2.0", 418 | "domhandler": "^4.2.0" 419 | }, 420 | "funding": { 421 | "url": "https://github.com/fb55/domutils?sponsor=1" 422 | } 423 | }, 424 | "node_modules/emmet": { 425 | "version": "2.3.6", 426 | "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.3.6.tgz", 427 | "integrity": "sha512-pLS4PBPDdxuUAmw7Me7+TcHbykTsBKN/S9XJbUOMFQrNv9MoshzyMFK/R57JBm94/6HSL4vHnDeEmxlC82NQ4A==", 428 | "dev": true, 429 | "dependencies": { 430 | "@emmetio/abbreviation": "^2.2.3", 431 | "@emmetio/css-abbreviation": "^2.1.4" 432 | } 433 | }, 434 | "node_modules/entities": { 435 | "version": "3.0.1", 436 | "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", 437 | "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", 438 | "dev": true, 439 | "engines": { 440 | "node": ">=0.12" 441 | }, 442 | "funding": { 443 | "url": "https://github.com/fb55/entities?sponsor=1" 444 | } 445 | }, 446 | "node_modules/esbuild": { 447 | "version": "0.14.36", 448 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz", 449 | "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==", 450 | "dev": true, 451 | "hasInstallScript": true, 452 | "bin": { 453 | "esbuild": "bin/esbuild" 454 | }, 455 | "engines": { 456 | "node": ">=12" 457 | }, 458 | "optionalDependencies": { 459 | "esbuild-android-64": "0.14.36", 460 | "esbuild-android-arm64": "0.14.36", 461 | "esbuild-darwin-64": "0.14.36", 462 | "esbuild-darwin-arm64": "0.14.36", 463 | "esbuild-freebsd-64": "0.14.36", 464 | "esbuild-freebsd-arm64": "0.14.36", 465 | "esbuild-linux-32": "0.14.36", 466 | "esbuild-linux-64": "0.14.36", 467 | "esbuild-linux-arm": "0.14.36", 468 | "esbuild-linux-arm64": "0.14.36", 469 | "esbuild-linux-mips64le": "0.14.36", 470 | "esbuild-linux-ppc64le": "0.14.36", 471 | "esbuild-linux-riscv64": "0.14.36", 472 | "esbuild-linux-s390x": "0.14.36", 473 | "esbuild-netbsd-64": "0.14.36", 474 | "esbuild-openbsd-64": "0.14.36", 475 | "esbuild-sunos-64": "0.14.36", 476 | "esbuild-windows-32": "0.14.36", 477 | "esbuild-windows-64": "0.14.36", 478 | "esbuild-windows-arm64": "0.14.36" 479 | } 480 | }, 481 | "node_modules/esbuild-android-64": { 482 | "version": "0.14.36", 483 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz", 484 | "integrity": "sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==", 485 | "cpu": [ 486 | "x64" 487 | ], 488 | "dev": true, 489 | "optional": true, 490 | "os": [ 491 | "android" 492 | ], 493 | "engines": { 494 | "node": ">=12" 495 | } 496 | }, 497 | "node_modules/esbuild-android-arm64": { 498 | "version": "0.14.36", 499 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz", 500 | "integrity": "sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==", 501 | "cpu": [ 502 | "arm64" 503 | ], 504 | "dev": true, 505 | "optional": true, 506 | "os": [ 507 | "android" 508 | ], 509 | "engines": { 510 | "node": ">=12" 511 | } 512 | }, 513 | "node_modules/esbuild-darwin-64": { 514 | "version": "0.14.36", 515 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz", 516 | "integrity": "sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==", 517 | "cpu": [ 518 | "x64" 519 | ], 520 | "dev": true, 521 | "optional": true, 522 | "os": [ 523 | "darwin" 524 | ], 525 | "engines": { 526 | "node": ">=12" 527 | } 528 | }, 529 | "node_modules/esbuild-darwin-arm64": { 530 | "version": "0.14.36", 531 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz", 532 | "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==", 533 | "cpu": [ 534 | "arm64" 535 | ], 536 | "dev": true, 537 | "optional": true, 538 | "os": [ 539 | "darwin" 540 | ], 541 | "engines": { 542 | "node": ">=12" 543 | } 544 | }, 545 | "node_modules/esbuild-freebsd-64": { 546 | "version": "0.14.36", 547 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz", 548 | "integrity": "sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==", 549 | "cpu": [ 550 | "x64" 551 | ], 552 | "dev": true, 553 | "optional": true, 554 | "os": [ 555 | "freebsd" 556 | ], 557 | "engines": { 558 | "node": ">=12" 559 | } 560 | }, 561 | "node_modules/esbuild-freebsd-arm64": { 562 | "version": "0.14.36", 563 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz", 564 | "integrity": "sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==", 565 | "cpu": [ 566 | "arm64" 567 | ], 568 | "dev": true, 569 | "optional": true, 570 | "os": [ 571 | "freebsd" 572 | ], 573 | "engines": { 574 | "node": ">=12" 575 | } 576 | }, 577 | "node_modules/esbuild-linux-32": { 578 | "version": "0.14.36", 579 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz", 580 | "integrity": "sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==", 581 | "cpu": [ 582 | "ia32" 583 | ], 584 | "dev": true, 585 | "optional": true, 586 | "os": [ 587 | "linux" 588 | ], 589 | "engines": { 590 | "node": ">=12" 591 | } 592 | }, 593 | "node_modules/esbuild-linux-64": { 594 | "version": "0.14.36", 595 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz", 596 | "integrity": "sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==", 597 | "cpu": [ 598 | "x64" 599 | ], 600 | "dev": true, 601 | "optional": true, 602 | "os": [ 603 | "linux" 604 | ], 605 | "engines": { 606 | "node": ">=12" 607 | } 608 | }, 609 | "node_modules/esbuild-linux-arm": { 610 | "version": "0.14.36", 611 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz", 612 | "integrity": "sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==", 613 | "cpu": [ 614 | "arm" 615 | ], 616 | "dev": true, 617 | "optional": true, 618 | "os": [ 619 | "linux" 620 | ], 621 | "engines": { 622 | "node": ">=12" 623 | } 624 | }, 625 | "node_modules/esbuild-linux-arm64": { 626 | "version": "0.14.36", 627 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz", 628 | "integrity": "sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==", 629 | "cpu": [ 630 | "arm64" 631 | ], 632 | "dev": true, 633 | "optional": true, 634 | "os": [ 635 | "linux" 636 | ], 637 | "engines": { 638 | "node": ">=12" 639 | } 640 | }, 641 | "node_modules/esbuild-linux-mips64le": { 642 | "version": "0.14.36", 643 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz", 644 | "integrity": "sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==", 645 | "cpu": [ 646 | "mips64el" 647 | ], 648 | "dev": true, 649 | "optional": true, 650 | "os": [ 651 | "linux" 652 | ], 653 | "engines": { 654 | "node": ">=12" 655 | } 656 | }, 657 | "node_modules/esbuild-linux-ppc64le": { 658 | "version": "0.14.36", 659 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz", 660 | "integrity": "sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==", 661 | "cpu": [ 662 | "ppc64" 663 | ], 664 | "dev": true, 665 | "optional": true, 666 | "os": [ 667 | "linux" 668 | ], 669 | "engines": { 670 | "node": ">=12" 671 | } 672 | }, 673 | "node_modules/esbuild-linux-riscv64": { 674 | "version": "0.14.36", 675 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz", 676 | "integrity": "sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==", 677 | "cpu": [ 678 | "riscv64" 679 | ], 680 | "dev": true, 681 | "optional": true, 682 | "os": [ 683 | "linux" 684 | ], 685 | "engines": { 686 | "node": ">=12" 687 | } 688 | }, 689 | "node_modules/esbuild-linux-s390x": { 690 | "version": "0.14.36", 691 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz", 692 | "integrity": "sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==", 693 | "cpu": [ 694 | "s390x" 695 | ], 696 | "dev": true, 697 | "optional": true, 698 | "os": [ 699 | "linux" 700 | ], 701 | "engines": { 702 | "node": ">=12" 703 | } 704 | }, 705 | "node_modules/esbuild-netbsd-64": { 706 | "version": "0.14.36", 707 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz", 708 | "integrity": "sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==", 709 | "cpu": [ 710 | "x64" 711 | ], 712 | "dev": true, 713 | "optional": true, 714 | "os": [ 715 | "netbsd" 716 | ], 717 | "engines": { 718 | "node": ">=12" 719 | } 720 | }, 721 | "node_modules/esbuild-openbsd-64": { 722 | "version": "0.14.36", 723 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz", 724 | "integrity": "sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==", 725 | "cpu": [ 726 | "x64" 727 | ], 728 | "dev": true, 729 | "optional": true, 730 | "os": [ 731 | "openbsd" 732 | ], 733 | "engines": { 734 | "node": ">=12" 735 | } 736 | }, 737 | "node_modules/esbuild-sunos-64": { 738 | "version": "0.14.36", 739 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz", 740 | "integrity": "sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==", 741 | "cpu": [ 742 | "x64" 743 | ], 744 | "dev": true, 745 | "optional": true, 746 | "os": [ 747 | "sunos" 748 | ], 749 | "engines": { 750 | "node": ">=12" 751 | } 752 | }, 753 | "node_modules/esbuild-windows-32": { 754 | "version": "0.14.36", 755 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz", 756 | "integrity": "sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==", 757 | "cpu": [ 758 | "ia32" 759 | ], 760 | "dev": true, 761 | "optional": true, 762 | "os": [ 763 | "win32" 764 | ], 765 | "engines": { 766 | "node": ">=12" 767 | } 768 | }, 769 | "node_modules/esbuild-windows-64": { 770 | "version": "0.14.36", 771 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz", 772 | "integrity": "sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==", 773 | "cpu": [ 774 | "x64" 775 | ], 776 | "dev": true, 777 | "optional": true, 778 | "os": [ 779 | "win32" 780 | ], 781 | "engines": { 782 | "node": ">=12" 783 | } 784 | }, 785 | "node_modules/esbuild-windows-arm64": { 786 | "version": "0.14.36", 787 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz", 788 | "integrity": "sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==", 789 | "cpu": [ 790 | "arm64" 791 | ], 792 | "dev": true, 793 | "optional": true, 794 | "os": [ 795 | "win32" 796 | ], 797 | "engines": { 798 | "node": ">=12" 799 | } 800 | }, 801 | "node_modules/estree-walker": { 802 | "version": "2.0.2", 803 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 804 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 805 | }, 806 | "node_modules/fsevents": { 807 | "version": "2.3.2", 808 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 809 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 810 | "dev": true, 811 | "hasInstallScript": true, 812 | "optional": true, 813 | "os": [ 814 | "darwin" 815 | ], 816 | "engines": { 817 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 818 | } 819 | }, 820 | "node_modules/function-bind": { 821 | "version": "1.1.1", 822 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 823 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 824 | "dev": true 825 | }, 826 | "node_modules/get-intrinsic": { 827 | "version": "1.1.1", 828 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 829 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 830 | "dev": true, 831 | "dependencies": { 832 | "function-bind": "^1.1.1", 833 | "has": "^1.0.3", 834 | "has-symbols": "^1.0.1" 835 | }, 836 | "funding": { 837 | "url": "https://github.com/sponsors/ljharb" 838 | } 839 | }, 840 | "node_modules/has": { 841 | "version": "1.0.3", 842 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 843 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 844 | "dev": true, 845 | "dependencies": { 846 | "function-bind": "^1.1.1" 847 | }, 848 | "engines": { 849 | "node": ">= 0.4.0" 850 | } 851 | }, 852 | "node_modules/has-symbols": { 853 | "version": "1.0.3", 854 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 855 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 856 | "dev": true, 857 | "engines": { 858 | "node": ">= 0.4" 859 | }, 860 | "funding": { 861 | "url": "https://github.com/sponsors/ljharb" 862 | } 863 | }, 864 | "node_modules/has-tostringtag": { 865 | "version": "1.0.0", 866 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 867 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 868 | "dev": true, 869 | "dependencies": { 870 | "has-symbols": "^1.0.2" 871 | }, 872 | "engines": { 873 | "node": ">= 0.4" 874 | }, 875 | "funding": { 876 | "url": "https://github.com/sponsors/ljharb" 877 | } 878 | }, 879 | "node_modules/htmlparser2": { 880 | "version": "7.2.0", 881 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", 882 | "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", 883 | "dev": true, 884 | "funding": [ 885 | "https://github.com/fb55/htmlparser2?sponsor=1", 886 | { 887 | "type": "github", 888 | "url": "https://github.com/sponsors/fb55" 889 | } 890 | ], 891 | "dependencies": { 892 | "domelementtype": "^2.0.1", 893 | "domhandler": "^4.2.2", 894 | "domutils": "^2.8.0", 895 | "entities": "^3.0.1" 896 | } 897 | }, 898 | "node_modules/inherits": { 899 | "version": "2.0.3", 900 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 901 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 902 | }, 903 | "node_modules/is-core-module": { 904 | "version": "2.8.1", 905 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 906 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 907 | "dev": true, 908 | "dependencies": { 909 | "has": "^1.0.3" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/ljharb" 913 | } 914 | }, 915 | "node_modules/is-expression": { 916 | "version": "4.0.0", 917 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", 918 | "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", 919 | "dev": true, 920 | "dependencies": { 921 | "acorn": "^7.1.1", 922 | "object-assign": "^4.1.1" 923 | } 924 | }, 925 | "node_modules/is-promise": { 926 | "version": "2.2.2", 927 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 928 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 929 | "dev": true 930 | }, 931 | "node_modules/is-regex": { 932 | "version": "1.1.4", 933 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 934 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 935 | "dev": true, 936 | "dependencies": { 937 | "call-bind": "^1.0.2", 938 | "has-tostringtag": "^1.0.0" 939 | }, 940 | "engines": { 941 | "node": ">= 0.4" 942 | }, 943 | "funding": { 944 | "url": "https://github.com/sponsors/ljharb" 945 | } 946 | }, 947 | "node_modules/js-stringify": { 948 | "version": "1.0.2", 949 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", 950 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", 951 | "dev": true 952 | }, 953 | "node_modules/jsonc-parser": { 954 | "version": "2.3.1", 955 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", 956 | "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", 957 | "dev": true 958 | }, 959 | "node_modules/jstransformer": { 960 | "version": "1.0.0", 961 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", 962 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", 963 | "dev": true, 964 | "dependencies": { 965 | "is-promise": "^2.0.0", 966 | "promise": "^7.0.1" 967 | } 968 | }, 969 | "node_modules/lru-cache": { 970 | "version": "6.0.0", 971 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 972 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 973 | "dev": true, 974 | "dependencies": { 975 | "yallist": "^4.0.0" 976 | }, 977 | "engines": { 978 | "node": ">=10" 979 | } 980 | }, 981 | "node_modules/magic-string": { 982 | "version": "0.25.9", 983 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 984 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 985 | "dependencies": { 986 | "sourcemap-codec": "^1.4.8" 987 | } 988 | }, 989 | "node_modules/nanoid": { 990 | "version": "3.3.2", 991 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", 992 | "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", 993 | "bin": { 994 | "nanoid": "bin/nanoid.cjs" 995 | }, 996 | "engines": { 997 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 998 | } 999 | }, 1000 | "node_modules/object-assign": { 1001 | "version": "4.1.1", 1002 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1003 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1004 | "dev": true, 1005 | "engines": { 1006 | "node": ">=0.10.0" 1007 | } 1008 | }, 1009 | "node_modules/path": { 1010 | "version": "0.12.7", 1011 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", 1012 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", 1013 | "dependencies": { 1014 | "process": "^0.11.1", 1015 | "util": "^0.10.3" 1016 | } 1017 | }, 1018 | "node_modules/path-parse": { 1019 | "version": "1.0.7", 1020 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1021 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1022 | "dev": true 1023 | }, 1024 | "node_modules/picocolors": { 1025 | "version": "1.0.0", 1026 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1027 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1028 | }, 1029 | "node_modules/postcss": { 1030 | "version": "8.4.12", 1031 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", 1032 | "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", 1033 | "funding": [ 1034 | { 1035 | "type": "opencollective", 1036 | "url": "https://opencollective.com/postcss/" 1037 | }, 1038 | { 1039 | "type": "tidelift", 1040 | "url": "https://tidelift.com/funding/github/npm/postcss" 1041 | } 1042 | ], 1043 | "dependencies": { 1044 | "nanoid": "^3.3.1", 1045 | "picocolors": "^1.0.0", 1046 | "source-map-js": "^1.0.2" 1047 | }, 1048 | "engines": { 1049 | "node": "^10 || ^12 || >=14" 1050 | } 1051 | }, 1052 | "node_modules/process": { 1053 | "version": "0.11.10", 1054 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1055 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1056 | "engines": { 1057 | "node": ">= 0.6.0" 1058 | } 1059 | }, 1060 | "node_modules/promise": { 1061 | "version": "7.3.1", 1062 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 1063 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 1064 | "dev": true, 1065 | "dependencies": { 1066 | "asap": "~2.0.3" 1067 | } 1068 | }, 1069 | "node_modules/pug": { 1070 | "version": "3.0.2", 1071 | "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", 1072 | "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", 1073 | "dev": true, 1074 | "dependencies": { 1075 | "pug-code-gen": "^3.0.2", 1076 | "pug-filters": "^4.0.0", 1077 | "pug-lexer": "^5.0.1", 1078 | "pug-linker": "^4.0.0", 1079 | "pug-load": "^3.0.0", 1080 | "pug-parser": "^6.0.0", 1081 | "pug-runtime": "^3.0.1", 1082 | "pug-strip-comments": "^2.0.0" 1083 | } 1084 | }, 1085 | "node_modules/pug-attrs": { 1086 | "version": "3.0.0", 1087 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", 1088 | "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", 1089 | "dev": true, 1090 | "dependencies": { 1091 | "constantinople": "^4.0.1", 1092 | "js-stringify": "^1.0.2", 1093 | "pug-runtime": "^3.0.0" 1094 | } 1095 | }, 1096 | "node_modules/pug-code-gen": { 1097 | "version": "3.0.2", 1098 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", 1099 | "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", 1100 | "dev": true, 1101 | "dependencies": { 1102 | "constantinople": "^4.0.1", 1103 | "doctypes": "^1.1.0", 1104 | "js-stringify": "^1.0.2", 1105 | "pug-attrs": "^3.0.0", 1106 | "pug-error": "^2.0.0", 1107 | "pug-runtime": "^3.0.0", 1108 | "void-elements": "^3.1.0", 1109 | "with": "^7.0.0" 1110 | } 1111 | }, 1112 | "node_modules/pug-error": { 1113 | "version": "2.0.0", 1114 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", 1115 | "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", 1116 | "dev": true 1117 | }, 1118 | "node_modules/pug-filters": { 1119 | "version": "4.0.0", 1120 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", 1121 | "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "constantinople": "^4.0.1", 1125 | "jstransformer": "1.0.0", 1126 | "pug-error": "^2.0.0", 1127 | "pug-walk": "^2.0.0", 1128 | "resolve": "^1.15.1" 1129 | } 1130 | }, 1131 | "node_modules/pug-lexer": { 1132 | "version": "5.0.1", 1133 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", 1134 | "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", 1135 | "dev": true, 1136 | "dependencies": { 1137 | "character-parser": "^2.2.0", 1138 | "is-expression": "^4.0.0", 1139 | "pug-error": "^2.0.0" 1140 | } 1141 | }, 1142 | "node_modules/pug-linker": { 1143 | "version": "4.0.0", 1144 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", 1145 | "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", 1146 | "dev": true, 1147 | "dependencies": { 1148 | "pug-error": "^2.0.0", 1149 | "pug-walk": "^2.0.0" 1150 | } 1151 | }, 1152 | "node_modules/pug-load": { 1153 | "version": "3.0.0", 1154 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", 1155 | "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", 1156 | "dev": true, 1157 | "dependencies": { 1158 | "object-assign": "^4.1.1", 1159 | "pug-walk": "^2.0.0" 1160 | } 1161 | }, 1162 | "node_modules/pug-parser": { 1163 | "version": "6.0.0", 1164 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", 1165 | "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", 1166 | "dev": true, 1167 | "dependencies": { 1168 | "pug-error": "^2.0.0", 1169 | "token-stream": "1.0.0" 1170 | } 1171 | }, 1172 | "node_modules/pug-runtime": { 1173 | "version": "3.0.1", 1174 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", 1175 | "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", 1176 | "dev": true 1177 | }, 1178 | "node_modules/pug-strip-comments": { 1179 | "version": "2.0.0", 1180 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", 1181 | "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", 1182 | "dev": true, 1183 | "dependencies": { 1184 | "pug-error": "^2.0.0" 1185 | } 1186 | }, 1187 | "node_modules/pug-walk": { 1188 | "version": "2.0.0", 1189 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", 1190 | "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", 1191 | "dev": true 1192 | }, 1193 | "node_modules/request-light": { 1194 | "version": "0.5.8", 1195 | "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", 1196 | "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", 1197 | "dev": true 1198 | }, 1199 | "node_modules/resolve": { 1200 | "version": "1.22.0", 1201 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1202 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1203 | "dev": true, 1204 | "dependencies": { 1205 | "is-core-module": "^2.8.1", 1206 | "path-parse": "^1.0.7", 1207 | "supports-preserve-symlinks-flag": "^1.0.0" 1208 | }, 1209 | "bin": { 1210 | "resolve": "bin/resolve" 1211 | }, 1212 | "funding": { 1213 | "url": "https://github.com/sponsors/ljharb" 1214 | } 1215 | }, 1216 | "node_modules/rollup": { 1217 | "version": "2.70.1", 1218 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", 1219 | "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", 1220 | "dev": true, 1221 | "bin": { 1222 | "rollup": "dist/bin/rollup" 1223 | }, 1224 | "engines": { 1225 | "node": ">=10.0.0" 1226 | }, 1227 | "optionalDependencies": { 1228 | "fsevents": "~2.3.2" 1229 | } 1230 | }, 1231 | "node_modules/semver": { 1232 | "version": "7.3.7", 1233 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 1234 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 1235 | "dev": true, 1236 | "dependencies": { 1237 | "lru-cache": "^6.0.0" 1238 | }, 1239 | "bin": { 1240 | "semver": "bin/semver.js" 1241 | }, 1242 | "engines": { 1243 | "node": ">=10" 1244 | } 1245 | }, 1246 | "node_modules/source-map": { 1247 | "version": "0.6.1", 1248 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1249 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1250 | "engines": { 1251 | "node": ">=0.10.0" 1252 | } 1253 | }, 1254 | "node_modules/source-map-js": { 1255 | "version": "1.0.2", 1256 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1257 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1258 | "engines": { 1259 | "node": ">=0.10.0" 1260 | } 1261 | }, 1262 | "node_modules/sourcemap-codec": { 1263 | "version": "1.4.8", 1264 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1265 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 1266 | }, 1267 | "node_modules/supports-preserve-symlinks-flag": { 1268 | "version": "1.0.0", 1269 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1270 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1271 | "dev": true, 1272 | "engines": { 1273 | "node": ">= 0.4" 1274 | }, 1275 | "funding": { 1276 | "url": "https://github.com/sponsors/ljharb" 1277 | } 1278 | }, 1279 | "node_modules/to-fast-properties": { 1280 | "version": "2.0.0", 1281 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1282 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1283 | "dev": true, 1284 | "engines": { 1285 | "node": ">=4" 1286 | } 1287 | }, 1288 | "node_modules/token-stream": { 1289 | "version": "1.0.0", 1290 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", 1291 | "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", 1292 | "dev": true 1293 | }, 1294 | "node_modules/typescript": { 1295 | "version": "4.6.3", 1296 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", 1297 | "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", 1298 | "dev": true, 1299 | "bin": { 1300 | "tsc": "bin/tsc", 1301 | "tsserver": "bin/tsserver" 1302 | }, 1303 | "engines": { 1304 | "node": ">=4.2.0" 1305 | } 1306 | }, 1307 | "node_modules/upath": { 1308 | "version": "2.0.1", 1309 | "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", 1310 | "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", 1311 | "dev": true, 1312 | "engines": { 1313 | "node": ">=4", 1314 | "yarn": "*" 1315 | } 1316 | }, 1317 | "node_modules/util": { 1318 | "version": "0.10.4", 1319 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1320 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1321 | "dependencies": { 1322 | "inherits": "2.0.3" 1323 | } 1324 | }, 1325 | "node_modules/vite": { 1326 | "version": "2.9.1", 1327 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", 1328 | "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", 1329 | "dev": true, 1330 | "dependencies": { 1331 | "esbuild": "^0.14.27", 1332 | "postcss": "^8.4.12", 1333 | "resolve": "^1.22.0", 1334 | "rollup": "^2.59.0" 1335 | }, 1336 | "bin": { 1337 | "vite": "bin/vite.js" 1338 | }, 1339 | "engines": { 1340 | "node": ">=12.2.0" 1341 | }, 1342 | "optionalDependencies": { 1343 | "fsevents": "~2.3.2" 1344 | }, 1345 | "peerDependencies": { 1346 | "less": "*", 1347 | "sass": "*", 1348 | "stylus": "*" 1349 | }, 1350 | "peerDependenciesMeta": { 1351 | "less": { 1352 | "optional": true 1353 | }, 1354 | "sass": { 1355 | "optional": true 1356 | }, 1357 | "stylus": { 1358 | "optional": true 1359 | } 1360 | } 1361 | }, 1362 | "node_modules/void-elements": { 1363 | "version": "3.1.0", 1364 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", 1365 | "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", 1366 | "dev": true, 1367 | "engines": { 1368 | "node": ">=0.10.0" 1369 | } 1370 | }, 1371 | "node_modules/vscode-css-languageservice": { 1372 | "version": "5.4.1", 1373 | "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-5.4.1.tgz", 1374 | "integrity": "sha512-W7D3GKFXf97ReAaU4EZ2nxVO1kQhztbycJgc1b/Ipr0h8zYWr88BADmrXu02z+lsCS84D7Sr4hoUzDKeaFn2Kg==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "vscode-languageserver-textdocument": "^1.0.4", 1378 | "vscode-languageserver-types": "^3.16.0", 1379 | "vscode-nls": "^5.0.0", 1380 | "vscode-uri": "^3.0.3" 1381 | } 1382 | }, 1383 | "node_modules/vscode-html-languageservice": { 1384 | "version": "4.2.4", 1385 | "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-4.2.4.tgz", 1386 | "integrity": "sha512-1HqvXKOq9WlZyW4HTD+0XzrjZoZ/YFrgQY2PZqktbRloHXVAUKm6+cAcvZi4YqKPVn05/CK7do+KBHfuSaEdbg==", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "vscode-languageserver-textdocument": "^1.0.4", 1390 | "vscode-languageserver-types": "^3.16.0", 1391 | "vscode-nls": "^5.0.0", 1392 | "vscode-uri": "^3.0.3" 1393 | } 1394 | }, 1395 | "node_modules/vscode-json-languageservice": { 1396 | "version": "4.2.1", 1397 | "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", 1398 | "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "jsonc-parser": "^3.0.0", 1402 | "vscode-languageserver-textdocument": "^1.0.3", 1403 | "vscode-languageserver-types": "^3.16.0", 1404 | "vscode-nls": "^5.0.0", 1405 | "vscode-uri": "^3.0.3" 1406 | } 1407 | }, 1408 | "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { 1409 | "version": "3.0.0", 1410 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", 1411 | "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", 1412 | "dev": true 1413 | }, 1414 | "node_modules/vscode-jsonrpc": { 1415 | "version": "8.0.0-next.7", 1416 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.0-next.7.tgz", 1417 | "integrity": "sha512-JX/F31LEsims0dAlOTKFE4E+AJMiJvdRSRViifFJSqSN7EzeYyWlfuDchF7g91oRNPZOIWfibTkDf3/UMsQGzQ==", 1418 | "dev": true, 1419 | "engines": { 1420 | "node": ">=14.0.0" 1421 | } 1422 | }, 1423 | "node_modules/vscode-languageserver": { 1424 | "version": "8.0.0-next.10", 1425 | "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.0-next.10.tgz", 1426 | "integrity": "sha512-sdjldl9ipuBSWVw5ENVMRcOVQwF0o+J6+lNA7FrB8MiLmzflnfjRoJMqA5tCEY8S/J/+P56ZR/dqiQnRYg5m8w==", 1427 | "dev": true, 1428 | "dependencies": { 1429 | "vscode-languageserver-protocol": "3.17.0-next.16" 1430 | }, 1431 | "bin": { 1432 | "installServerIntoExtension": "bin/installServerIntoExtension" 1433 | } 1434 | }, 1435 | "node_modules/vscode-languageserver-protocol": { 1436 | "version": "3.17.0-next.16", 1437 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.0-next.16.tgz", 1438 | "integrity": "sha512-tx4DnXw9u3N7vw+bx6n2NKp6FoxoNwiP/biH83AS30I2AnTGyLd7afSeH6Oewn2E8jvB7K15bs12sMppkKOVeQ==", 1439 | "dev": true, 1440 | "dependencies": { 1441 | "vscode-jsonrpc": "8.0.0-next.7", 1442 | "vscode-languageserver-types": "3.17.0-next.9" 1443 | } 1444 | }, 1445 | "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { 1446 | "version": "3.17.0-next.9", 1447 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.9.tgz", 1448 | "integrity": "sha512-9/PeDNPYduaoXRUzYpqmu4ZV9L01HGo0wH9FUt+sSHR7IXwA7xoXBfNUlv8gB9H0D2WwEmMomSy1NmhjKQyn3A==", 1449 | "dev": true 1450 | }, 1451 | "node_modules/vscode-languageserver-textdocument": { 1452 | "version": "1.0.4", 1453 | "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz", 1454 | "integrity": "sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==", 1455 | "dev": true 1456 | }, 1457 | "node_modules/vscode-languageserver-types": { 1458 | "version": "3.16.0", 1459 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", 1460 | "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", 1461 | "dev": true 1462 | }, 1463 | "node_modules/vscode-nls": { 1464 | "version": "5.0.0", 1465 | "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", 1466 | "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", 1467 | "dev": true 1468 | }, 1469 | "node_modules/vscode-pug-languageservice": { 1470 | "version": "0.29.8", 1471 | "resolved": "https://registry.npmjs.org/vscode-pug-languageservice/-/vscode-pug-languageservice-0.29.8.tgz", 1472 | "integrity": "sha512-QHYAzDSJLg7GOLxCZ12qsM0dAM0dPeMSS1t4kKfzLsfpErmZpFzkAIXbidVrNMdMffGZMtTuIlcpEyWHbx96Iw==", 1473 | "deprecated": "WARNING: This project has been renamed to @volar/pug-language-service. Install using @volar/pug-language-service instead.", 1474 | "dev": true, 1475 | "dependencies": { 1476 | "@volar/code-gen": "0.29.8", 1477 | "@volar/shared": "0.29.8", 1478 | "@volar/source-map": "0.29.8", 1479 | "@volar/transforms": "0.29.8", 1480 | "pug-lexer": "^5.0.1", 1481 | "pug-parser": "^6.0.0", 1482 | "vscode-languageserver": "^8.0.0-next.2" 1483 | } 1484 | }, 1485 | "node_modules/vscode-typescript-languageservice": { 1486 | "version": "0.29.8", 1487 | "resolved": "https://registry.npmjs.org/vscode-typescript-languageservice/-/vscode-typescript-languageservice-0.29.8.tgz", 1488 | "integrity": "sha512-eecDqHk4WjEvy6VHQ6teHczppQ9yJO2wExCy7yu7WiFj35qbw0h4G6Erv46MvP3ClL8FggFzD7s1qM6vdqJUfw==", 1489 | "deprecated": "WARNING: This project has been renamed to @volar/typescript-language-service. Install using @volar/typescript-language-service instead.", 1490 | "dev": true, 1491 | "dependencies": { 1492 | "@volar/shared": "0.29.8", 1493 | "semver": "^7.3.5", 1494 | "upath": "^2.0.1", 1495 | "vscode-languageserver": "^8.0.0-next.2", 1496 | "vscode-languageserver-textdocument": "^1.0.1" 1497 | } 1498 | }, 1499 | "node_modules/vscode-uri": { 1500 | "version": "3.0.3", 1501 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz", 1502 | "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==", 1503 | "dev": true 1504 | }, 1505 | "node_modules/vscode-vue-languageservice": { 1506 | "version": "0.29.8", 1507 | "resolved": "https://registry.npmjs.org/vscode-vue-languageservice/-/vscode-vue-languageservice-0.29.8.tgz", 1508 | "integrity": "sha512-qSJdvW5ttyGUB/8uWDKgo8vnIoFnXYlBP4Z/cn54btsRn6ZMw7IJGJU1381e7p/yGvMTLeGbugD53SghbnSa6g==", 1509 | "deprecated": "WARNING: This project has been renamed to @volar/vue-language-service. Install using @volar/vue-language-service instead.", 1510 | "dev": true, 1511 | "dependencies": { 1512 | "@volar/code-gen": "0.29.8", 1513 | "@volar/html2pug": "0.29.8", 1514 | "@volar/shared": "0.29.8", 1515 | "@volar/source-map": "0.29.8", 1516 | "@volar/transforms": "0.29.8", 1517 | "@volar/vue-code-gen": "0.29.8", 1518 | "@vscode/emmet-helper": "^2.8.0", 1519 | "@vue/reactivity": "^3.2.21", 1520 | "@vue/shared": "^3.2.21", 1521 | "request-light": "^0.5.4", 1522 | "upath": "^2.0.1", 1523 | "vscode-css-languageservice": "^5.1.7", 1524 | "vscode-html-languageservice": "^4.1.0", 1525 | "vscode-json-languageservice": "^4.1.8", 1526 | "vscode-languageserver": "^8.0.0-next.2", 1527 | "vscode-languageserver-textdocument": "^1.0.1", 1528 | "vscode-pug-languageservice": "0.29.8", 1529 | "vscode-typescript-languageservice": "0.29.8" 1530 | } 1531 | }, 1532 | "node_modules/vue": { 1533 | "version": "3.2.32", 1534 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.32.tgz", 1535 | "integrity": "sha512-6L3jKZApF042OgbCkh+HcFeAkiYi3Lovi8wNhWqIK98Pi5efAMLZzRHgi91v+60oIRxdJsGS9sTMsb+yDpY8Eg==", 1536 | "dependencies": { 1537 | "@vue/compiler-dom": "3.2.32", 1538 | "@vue/compiler-sfc": "3.2.32", 1539 | "@vue/runtime-dom": "3.2.32", 1540 | "@vue/server-renderer": "3.2.32", 1541 | "@vue/shared": "3.2.32" 1542 | } 1543 | }, 1544 | "node_modules/vue-tsc": { 1545 | "version": "0.29.8", 1546 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.29.8.tgz", 1547 | "integrity": "sha512-pT0wLRjvRuSmB+J4WJT6uuV9mO0KtSSXEAtaVXZQzyk5+DJdbLIQTbRce/TXSkfqt1l1WogO78RjtOJFiMCgfQ==", 1548 | "dev": true, 1549 | "dependencies": { 1550 | "@volar/shared": "0.29.8", 1551 | "vscode-vue-languageservice": "0.29.8" 1552 | }, 1553 | "bin": { 1554 | "vue-tsc": "bin/vue-tsc.js" 1555 | }, 1556 | "peerDependencies": { 1557 | "typescript": "*" 1558 | } 1559 | }, 1560 | "node_modules/with": { 1561 | "version": "7.0.2", 1562 | "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", 1563 | "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", 1564 | "dev": true, 1565 | "dependencies": { 1566 | "@babel/parser": "^7.9.6", 1567 | "@babel/types": "^7.9.6", 1568 | "assert-never": "^1.2.1", 1569 | "babel-walk": "3.0.0-canary-5" 1570 | }, 1571 | "engines": { 1572 | "node": ">= 10.0.0" 1573 | } 1574 | }, 1575 | "node_modules/yallist": { 1576 | "version": "4.0.0", 1577 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1578 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1579 | "dev": true 1580 | } 1581 | }, 1582 | "dependencies": { 1583 | "@babel/helper-validator-identifier": { 1584 | "version": "7.16.7", 1585 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 1586 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 1587 | "dev": true 1588 | }, 1589 | "@babel/parser": { 1590 | "version": "7.17.9", 1591 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", 1592 | "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" 1593 | }, 1594 | "@babel/types": { 1595 | "version": "7.17.0", 1596 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", 1597 | "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", 1598 | "dev": true, 1599 | "requires": { 1600 | "@babel/helper-validator-identifier": "^7.16.7", 1601 | "to-fast-properties": "^2.0.0" 1602 | } 1603 | }, 1604 | "@emmetio/abbreviation": { 1605 | "version": "2.2.3", 1606 | "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.2.3.tgz", 1607 | "integrity": "sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==", 1608 | "dev": true, 1609 | "requires": { 1610 | "@emmetio/scanner": "^1.0.0" 1611 | } 1612 | }, 1613 | "@emmetio/css-abbreviation": { 1614 | "version": "2.1.4", 1615 | "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz", 1616 | "integrity": "sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw==", 1617 | "dev": true, 1618 | "requires": { 1619 | "@emmetio/scanner": "^1.0.0" 1620 | } 1621 | }, 1622 | "@emmetio/scanner": { 1623 | "version": "1.0.0", 1624 | "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.0.tgz", 1625 | "integrity": "sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==", 1626 | "dev": true 1627 | }, 1628 | "@vitejs/plugin-vue": { 1629 | "version": "2.3.1", 1630 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.1.tgz", 1631 | "integrity": "sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ==", 1632 | "dev": true, 1633 | "requires": {} 1634 | }, 1635 | "@volar/code-gen": { 1636 | "version": "0.29.8", 1637 | "resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.29.8.tgz", 1638 | "integrity": "sha512-eohLLUqPChHRPDFT5gXn4V6pr/CeTri7Ou5GI26lUvBRRAbP8p+oYfQRcbMPGeKmVkYjfVj0chsxQGx6T8PQ4Q==", 1639 | "dev": true, 1640 | "requires": { 1641 | "@volar/shared": "0.29.8", 1642 | "@volar/source-map": "0.29.8" 1643 | } 1644 | }, 1645 | "@volar/html2pug": { 1646 | "version": "0.29.8", 1647 | "resolved": "https://registry.npmjs.org/@volar/html2pug/-/html2pug-0.29.8.tgz", 1648 | "integrity": "sha512-bhSNXg8A2aD3w0B+CwmHjqCAaKtj5rORbE5C/q/UdGqptJbC6STCmi30KuRTdfPhR++Xb18Hauf3s/WCmtNAPA==", 1649 | "dev": true, 1650 | "requires": { 1651 | "domelementtype": "^2.2.0", 1652 | "domhandler": "^4.2.2", 1653 | "htmlparser2": "^7.1.2", 1654 | "pug": "^3.0.2" 1655 | } 1656 | }, 1657 | "@volar/shared": { 1658 | "version": "0.29.8", 1659 | "resolved": "https://registry.npmjs.org/@volar/shared/-/shared-0.29.8.tgz", 1660 | "integrity": "sha512-Y1NN6irkIukD+T0wf4p/dHWYL90sacN2e2lYoDXxRlvoYxwANnHgw0J0Rcp+yw58ElWRScdG7/YntEIuZWeJsw==", 1661 | "dev": true, 1662 | "requires": { 1663 | "upath": "^2.0.1", 1664 | "vscode-jsonrpc": "^8.0.0-next.2", 1665 | "vscode-uri": "^3.0.2" 1666 | } 1667 | }, 1668 | "@volar/source-map": { 1669 | "version": "0.29.8", 1670 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.29.8.tgz", 1671 | "integrity": "sha512-7w+UoYtnc6UQu30CgMVvx0YN4dzDgP4TIsSmUaW62AGmxU9Lxwp3Kkn/4N8efi91z8ma5Z78v/HddyJPwAC3LA==", 1672 | "dev": true, 1673 | "requires": { 1674 | "@volar/shared": "0.29.8" 1675 | } 1676 | }, 1677 | "@volar/transforms": { 1678 | "version": "0.29.8", 1679 | "resolved": "https://registry.npmjs.org/@volar/transforms/-/transforms-0.29.8.tgz", 1680 | "integrity": "sha512-o2hRa8CoDwYTO1Mu5KA47+1elUnYUjDaVhCvbyKlRfd8qpHea2llotArq7B6OORSL2M9DVs1IRJ5NGURBFeZ3Q==", 1681 | "dev": true, 1682 | "requires": { 1683 | "@volar/shared": "0.29.8", 1684 | "vscode-languageserver": "^8.0.0-next.2" 1685 | } 1686 | }, 1687 | "@volar/vue-code-gen": { 1688 | "version": "0.29.8", 1689 | "resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.29.8.tgz", 1690 | "integrity": "sha512-E1e7P2oktNC/DzgDBditfla4s8+HlUlluZ+BtcLvEdbkl3QEjujkB0x1wxguWzXmpWgLIDPtrS3Jzll5cCOkTg==", 1691 | "dev": true, 1692 | "requires": { 1693 | "@volar/code-gen": "0.29.8", 1694 | "@volar/shared": "0.29.8", 1695 | "@volar/source-map": "0.29.8", 1696 | "@vue/compiler-core": "^3.2.21", 1697 | "@vue/compiler-dom": "^3.2.21", 1698 | "@vue/shared": "^3.2.21", 1699 | "upath": "^2.0.1" 1700 | } 1701 | }, 1702 | "@vscode/emmet-helper": { 1703 | "version": "2.8.4", 1704 | "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.8.4.tgz", 1705 | "integrity": "sha512-lUki5QLS47bz/U8IlG9VQ+1lfxMtxMZENmU5nu4Z71eOD5j9FK0SmYGL5NiVJg9WBWeAU0VxRADMY2Qpq7BfVg==", 1706 | "dev": true, 1707 | "requires": { 1708 | "emmet": "^2.3.0", 1709 | "jsonc-parser": "^2.3.0", 1710 | "vscode-languageserver-textdocument": "^1.0.1", 1711 | "vscode-languageserver-types": "^3.15.1", 1712 | "vscode-nls": "^5.0.0", 1713 | "vscode-uri": "^2.1.2" 1714 | }, 1715 | "dependencies": { 1716 | "vscode-uri": { 1717 | "version": "2.1.2", 1718 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", 1719 | "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", 1720 | "dev": true 1721 | } 1722 | } 1723 | }, 1724 | "@vue/compiler-core": { 1725 | "version": "3.2.32", 1726 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.32.tgz", 1727 | "integrity": "sha512-bRQ8Rkpm/aYFElDWtKkTPHeLnX5pEkNxhPUcqu5crEJIilZH0yeFu/qUAcV4VfSE2AudNPkQSOwMZofhnuutmA==", 1728 | "requires": { 1729 | "@babel/parser": "^7.16.4", 1730 | "@vue/shared": "3.2.32", 1731 | "estree-walker": "^2.0.2", 1732 | "source-map": "^0.6.1" 1733 | } 1734 | }, 1735 | "@vue/compiler-dom": { 1736 | "version": "3.2.32", 1737 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.32.tgz", 1738 | "integrity": "sha512-maa3PNB/NxR17h2hDQfcmS02o1f9r9QIpN1y6fe8tWPrS1E4+q8MqrvDDQNhYVPd84rc3ybtyumrgm9D5Rf/kg==", 1739 | "requires": { 1740 | "@vue/compiler-core": "3.2.32", 1741 | "@vue/shared": "3.2.32" 1742 | } 1743 | }, 1744 | "@vue/compiler-sfc": { 1745 | "version": "3.2.32", 1746 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.32.tgz", 1747 | "integrity": "sha512-uO6+Gh3AVdWm72lRRCjMr8nMOEqc6ezT9lWs5dPzh1E9TNaJkMYPaRtdY9flUv/fyVQotkfjY/ponjfR+trPSg==", 1748 | "requires": { 1749 | "@babel/parser": "^7.16.4", 1750 | "@vue/compiler-core": "3.2.32", 1751 | "@vue/compiler-dom": "3.2.32", 1752 | "@vue/compiler-ssr": "3.2.32", 1753 | "@vue/reactivity-transform": "3.2.32", 1754 | "@vue/shared": "3.2.32", 1755 | "estree-walker": "^2.0.2", 1756 | "magic-string": "^0.25.7", 1757 | "postcss": "^8.1.10", 1758 | "source-map": "^0.6.1" 1759 | } 1760 | }, 1761 | "@vue/compiler-ssr": { 1762 | "version": "3.2.32", 1763 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.32.tgz", 1764 | "integrity": "sha512-ZklVUF/SgTx6yrDUkaTaBL/JMVOtSocP+z5Xz/qIqqLdW/hWL90P+ob/jOQ0Xc/om57892Q7sRSrex0wujOL2Q==", 1765 | "requires": { 1766 | "@vue/compiler-dom": "3.2.32", 1767 | "@vue/shared": "3.2.32" 1768 | } 1769 | }, 1770 | "@vue/reactivity": { 1771 | "version": "3.2.32", 1772 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.32.tgz", 1773 | "integrity": "sha512-4zaDumuyDqkuhbb63hRd+YHFGopW7srFIWesLUQ2su/rJfWrSq3YUvoKAJE8Eu1EhZ2Q4c1NuwnEreKj1FkDxA==", 1774 | "requires": { 1775 | "@vue/shared": "3.2.32" 1776 | } 1777 | }, 1778 | "@vue/reactivity-transform": { 1779 | "version": "3.2.32", 1780 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.32.tgz", 1781 | "integrity": "sha512-CW1W9zaJtE275tZSWIfQKiPG0iHpdtSlmTqYBu7Y62qvtMgKG5yOxtvBs4RlrZHlaqFSE26avLAgQiTp4YHozw==", 1782 | "requires": { 1783 | "@babel/parser": "^7.16.4", 1784 | "@vue/compiler-core": "3.2.32", 1785 | "@vue/shared": "3.2.32", 1786 | "estree-walker": "^2.0.2", 1787 | "magic-string": "^0.25.7" 1788 | } 1789 | }, 1790 | "@vue/runtime-core": { 1791 | "version": "3.2.32", 1792 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.32.tgz", 1793 | "integrity": "sha512-uKKzK6LaCnbCJ7rcHvsK0azHLGpqs+Vi9B28CV1mfWVq1F3Bj8Okk3cX+5DtD06aUh4V2bYhS2UjjWiUUKUF0w==", 1794 | "requires": { 1795 | "@vue/reactivity": "3.2.32", 1796 | "@vue/shared": "3.2.32" 1797 | } 1798 | }, 1799 | "@vue/runtime-dom": { 1800 | "version": "3.2.32", 1801 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.32.tgz", 1802 | "integrity": "sha512-AmlIg+GPqjkNoADLjHojEX5RGcAg+TsgXOOcUrtDHwKvA8mO26EnLQLB8nylDjU6AMJh2CIYn8NEgyOV5ZIScQ==", 1803 | "requires": { 1804 | "@vue/runtime-core": "3.2.32", 1805 | "@vue/shared": "3.2.32", 1806 | "csstype": "^2.6.8" 1807 | } 1808 | }, 1809 | "@vue/server-renderer": { 1810 | "version": "3.2.32", 1811 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.32.tgz", 1812 | "integrity": "sha512-TYKpZZfRJpGTTiy/s6bVYwQJpAUx3G03z4G7/3O18M11oacrMTVHaHjiPuPqf3xQtY8R4LKmQ3EOT/DRCA/7Wg==", 1813 | "requires": { 1814 | "@vue/compiler-ssr": "3.2.32", 1815 | "@vue/shared": "3.2.32" 1816 | } 1817 | }, 1818 | "@vue/shared": { 1819 | "version": "3.2.32", 1820 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.32.tgz", 1821 | "integrity": "sha512-bjcixPErUsAnTQRQX4Z5IQnICYjIfNCyCl8p29v1M6kfVzvwOICPw+dz48nNuWlTOOx2RHhzHdazJibE8GSnsw==" 1822 | }, 1823 | "acorn": { 1824 | "version": "7.4.1", 1825 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1826 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1827 | "dev": true 1828 | }, 1829 | "asap": { 1830 | "version": "2.0.6", 1831 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 1832 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 1833 | "dev": true 1834 | }, 1835 | "assert-never": { 1836 | "version": "1.2.1", 1837 | "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", 1838 | "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", 1839 | "dev": true 1840 | }, 1841 | "babel-walk": { 1842 | "version": "3.0.0-canary-5", 1843 | "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", 1844 | "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", 1845 | "dev": true, 1846 | "requires": { 1847 | "@babel/types": "^7.9.6" 1848 | } 1849 | }, 1850 | "call-bind": { 1851 | "version": "1.0.2", 1852 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1853 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1854 | "dev": true, 1855 | "requires": { 1856 | "function-bind": "^1.1.1", 1857 | "get-intrinsic": "^1.0.2" 1858 | } 1859 | }, 1860 | "character-parser": { 1861 | "version": "2.2.0", 1862 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", 1863 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", 1864 | "dev": true, 1865 | "requires": { 1866 | "is-regex": "^1.0.3" 1867 | } 1868 | }, 1869 | "constantinople": { 1870 | "version": "4.0.1", 1871 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", 1872 | "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", 1873 | "dev": true, 1874 | "requires": { 1875 | "@babel/parser": "^7.6.0", 1876 | "@babel/types": "^7.6.1" 1877 | } 1878 | }, 1879 | "csstype": { 1880 | "version": "2.6.20", 1881 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", 1882 | "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" 1883 | }, 1884 | "doctypes": { 1885 | "version": "1.1.0", 1886 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", 1887 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", 1888 | "dev": true 1889 | }, 1890 | "dom-serializer": { 1891 | "version": "1.4.1", 1892 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 1893 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 1894 | "dev": true, 1895 | "requires": { 1896 | "domelementtype": "^2.0.1", 1897 | "domhandler": "^4.2.0", 1898 | "entities": "^2.0.0" 1899 | }, 1900 | "dependencies": { 1901 | "entities": { 1902 | "version": "2.2.0", 1903 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 1904 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 1905 | "dev": true 1906 | } 1907 | } 1908 | }, 1909 | "domelementtype": { 1910 | "version": "2.3.0", 1911 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1912 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1913 | "dev": true 1914 | }, 1915 | "domhandler": { 1916 | "version": "4.3.1", 1917 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 1918 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 1919 | "dev": true, 1920 | "requires": { 1921 | "domelementtype": "^2.2.0" 1922 | } 1923 | }, 1924 | "domutils": { 1925 | "version": "2.8.0", 1926 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 1927 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 1928 | "dev": true, 1929 | "requires": { 1930 | "dom-serializer": "^1.0.1", 1931 | "domelementtype": "^2.2.0", 1932 | "domhandler": "^4.2.0" 1933 | } 1934 | }, 1935 | "emmet": { 1936 | "version": "2.3.6", 1937 | "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.3.6.tgz", 1938 | "integrity": "sha512-pLS4PBPDdxuUAmw7Me7+TcHbykTsBKN/S9XJbUOMFQrNv9MoshzyMFK/R57JBm94/6HSL4vHnDeEmxlC82NQ4A==", 1939 | "dev": true, 1940 | "requires": { 1941 | "@emmetio/abbreviation": "^2.2.3", 1942 | "@emmetio/css-abbreviation": "^2.1.4" 1943 | } 1944 | }, 1945 | "entities": { 1946 | "version": "3.0.1", 1947 | "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", 1948 | "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", 1949 | "dev": true 1950 | }, 1951 | "esbuild": { 1952 | "version": "0.14.36", 1953 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz", 1954 | "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==", 1955 | "dev": true, 1956 | "requires": { 1957 | "esbuild-android-64": "0.14.36", 1958 | "esbuild-android-arm64": "0.14.36", 1959 | "esbuild-darwin-64": "0.14.36", 1960 | "esbuild-darwin-arm64": "0.14.36", 1961 | "esbuild-freebsd-64": "0.14.36", 1962 | "esbuild-freebsd-arm64": "0.14.36", 1963 | "esbuild-linux-32": "0.14.36", 1964 | "esbuild-linux-64": "0.14.36", 1965 | "esbuild-linux-arm": "0.14.36", 1966 | "esbuild-linux-arm64": "0.14.36", 1967 | "esbuild-linux-mips64le": "0.14.36", 1968 | "esbuild-linux-ppc64le": "0.14.36", 1969 | "esbuild-linux-riscv64": "0.14.36", 1970 | "esbuild-linux-s390x": "0.14.36", 1971 | "esbuild-netbsd-64": "0.14.36", 1972 | "esbuild-openbsd-64": "0.14.36", 1973 | "esbuild-sunos-64": "0.14.36", 1974 | "esbuild-windows-32": "0.14.36", 1975 | "esbuild-windows-64": "0.14.36", 1976 | "esbuild-windows-arm64": "0.14.36" 1977 | } 1978 | }, 1979 | "esbuild-android-64": { 1980 | "version": "0.14.36", 1981 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz", 1982 | "integrity": "sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==", 1983 | "dev": true, 1984 | "optional": true 1985 | }, 1986 | "esbuild-android-arm64": { 1987 | "version": "0.14.36", 1988 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz", 1989 | "integrity": "sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==", 1990 | "dev": true, 1991 | "optional": true 1992 | }, 1993 | "esbuild-darwin-64": { 1994 | "version": "0.14.36", 1995 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz", 1996 | "integrity": "sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==", 1997 | "dev": true, 1998 | "optional": true 1999 | }, 2000 | "esbuild-darwin-arm64": { 2001 | "version": "0.14.36", 2002 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz", 2003 | "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==", 2004 | "dev": true, 2005 | "optional": true 2006 | }, 2007 | "esbuild-freebsd-64": { 2008 | "version": "0.14.36", 2009 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz", 2010 | "integrity": "sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==", 2011 | "dev": true, 2012 | "optional": true 2013 | }, 2014 | "esbuild-freebsd-arm64": { 2015 | "version": "0.14.36", 2016 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz", 2017 | "integrity": "sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==", 2018 | "dev": true, 2019 | "optional": true 2020 | }, 2021 | "esbuild-linux-32": { 2022 | "version": "0.14.36", 2023 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz", 2024 | "integrity": "sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==", 2025 | "dev": true, 2026 | "optional": true 2027 | }, 2028 | "esbuild-linux-64": { 2029 | "version": "0.14.36", 2030 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz", 2031 | "integrity": "sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==", 2032 | "dev": true, 2033 | "optional": true 2034 | }, 2035 | "esbuild-linux-arm": { 2036 | "version": "0.14.36", 2037 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz", 2038 | "integrity": "sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==", 2039 | "dev": true, 2040 | "optional": true 2041 | }, 2042 | "esbuild-linux-arm64": { 2043 | "version": "0.14.36", 2044 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz", 2045 | "integrity": "sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==", 2046 | "dev": true, 2047 | "optional": true 2048 | }, 2049 | "esbuild-linux-mips64le": { 2050 | "version": "0.14.36", 2051 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz", 2052 | "integrity": "sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==", 2053 | "dev": true, 2054 | "optional": true 2055 | }, 2056 | "esbuild-linux-ppc64le": { 2057 | "version": "0.14.36", 2058 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz", 2059 | "integrity": "sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==", 2060 | "dev": true, 2061 | "optional": true 2062 | }, 2063 | "esbuild-linux-riscv64": { 2064 | "version": "0.14.36", 2065 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz", 2066 | "integrity": "sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==", 2067 | "dev": true, 2068 | "optional": true 2069 | }, 2070 | "esbuild-linux-s390x": { 2071 | "version": "0.14.36", 2072 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz", 2073 | "integrity": "sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==", 2074 | "dev": true, 2075 | "optional": true 2076 | }, 2077 | "esbuild-netbsd-64": { 2078 | "version": "0.14.36", 2079 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz", 2080 | "integrity": "sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==", 2081 | "dev": true, 2082 | "optional": true 2083 | }, 2084 | "esbuild-openbsd-64": { 2085 | "version": "0.14.36", 2086 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz", 2087 | "integrity": "sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==", 2088 | "dev": true, 2089 | "optional": true 2090 | }, 2091 | "esbuild-sunos-64": { 2092 | "version": "0.14.36", 2093 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz", 2094 | "integrity": "sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==", 2095 | "dev": true, 2096 | "optional": true 2097 | }, 2098 | "esbuild-windows-32": { 2099 | "version": "0.14.36", 2100 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz", 2101 | "integrity": "sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==", 2102 | "dev": true, 2103 | "optional": true 2104 | }, 2105 | "esbuild-windows-64": { 2106 | "version": "0.14.36", 2107 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz", 2108 | "integrity": "sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==", 2109 | "dev": true, 2110 | "optional": true 2111 | }, 2112 | "esbuild-windows-arm64": { 2113 | "version": "0.14.36", 2114 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz", 2115 | "integrity": "sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==", 2116 | "dev": true, 2117 | "optional": true 2118 | }, 2119 | "estree-walker": { 2120 | "version": "2.0.2", 2121 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2122 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 2123 | }, 2124 | "fsevents": { 2125 | "version": "2.3.2", 2126 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2127 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2128 | "dev": true, 2129 | "optional": true 2130 | }, 2131 | "function-bind": { 2132 | "version": "1.1.1", 2133 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2134 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2135 | "dev": true 2136 | }, 2137 | "get-intrinsic": { 2138 | "version": "1.1.1", 2139 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 2140 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 2141 | "dev": true, 2142 | "requires": { 2143 | "function-bind": "^1.1.1", 2144 | "has": "^1.0.3", 2145 | "has-symbols": "^1.0.1" 2146 | } 2147 | }, 2148 | "has": { 2149 | "version": "1.0.3", 2150 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2151 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2152 | "dev": true, 2153 | "requires": { 2154 | "function-bind": "^1.1.1" 2155 | } 2156 | }, 2157 | "has-symbols": { 2158 | "version": "1.0.3", 2159 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2160 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2161 | "dev": true 2162 | }, 2163 | "has-tostringtag": { 2164 | "version": "1.0.0", 2165 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 2166 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 2167 | "dev": true, 2168 | "requires": { 2169 | "has-symbols": "^1.0.2" 2170 | } 2171 | }, 2172 | "htmlparser2": { 2173 | "version": "7.2.0", 2174 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", 2175 | "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", 2176 | "dev": true, 2177 | "requires": { 2178 | "domelementtype": "^2.0.1", 2179 | "domhandler": "^4.2.2", 2180 | "domutils": "^2.8.0", 2181 | "entities": "^3.0.1" 2182 | } 2183 | }, 2184 | "inherits": { 2185 | "version": "2.0.3", 2186 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2187 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2188 | }, 2189 | "is-core-module": { 2190 | "version": "2.8.1", 2191 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 2192 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 2193 | "dev": true, 2194 | "requires": { 2195 | "has": "^1.0.3" 2196 | } 2197 | }, 2198 | "is-expression": { 2199 | "version": "4.0.0", 2200 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", 2201 | "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", 2202 | "dev": true, 2203 | "requires": { 2204 | "acorn": "^7.1.1", 2205 | "object-assign": "^4.1.1" 2206 | } 2207 | }, 2208 | "is-promise": { 2209 | "version": "2.2.2", 2210 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 2211 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 2212 | "dev": true 2213 | }, 2214 | "is-regex": { 2215 | "version": "1.1.4", 2216 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 2217 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 2218 | "dev": true, 2219 | "requires": { 2220 | "call-bind": "^1.0.2", 2221 | "has-tostringtag": "^1.0.0" 2222 | } 2223 | }, 2224 | "js-stringify": { 2225 | "version": "1.0.2", 2226 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", 2227 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", 2228 | "dev": true 2229 | }, 2230 | "jsonc-parser": { 2231 | "version": "2.3.1", 2232 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", 2233 | "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", 2234 | "dev": true 2235 | }, 2236 | "jstransformer": { 2237 | "version": "1.0.0", 2238 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", 2239 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", 2240 | "dev": true, 2241 | "requires": { 2242 | "is-promise": "^2.0.0", 2243 | "promise": "^7.0.1" 2244 | } 2245 | }, 2246 | "lru-cache": { 2247 | "version": "6.0.0", 2248 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2249 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2250 | "dev": true, 2251 | "requires": { 2252 | "yallist": "^4.0.0" 2253 | } 2254 | }, 2255 | "magic-string": { 2256 | "version": "0.25.9", 2257 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 2258 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 2259 | "requires": { 2260 | "sourcemap-codec": "^1.4.8" 2261 | } 2262 | }, 2263 | "nanoid": { 2264 | "version": "3.3.2", 2265 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", 2266 | "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" 2267 | }, 2268 | "object-assign": { 2269 | "version": "4.1.1", 2270 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2271 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2272 | "dev": true 2273 | }, 2274 | "path": { 2275 | "version": "0.12.7", 2276 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", 2277 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", 2278 | "requires": { 2279 | "process": "^0.11.1", 2280 | "util": "^0.10.3" 2281 | } 2282 | }, 2283 | "path-parse": { 2284 | "version": "1.0.7", 2285 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2286 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2287 | "dev": true 2288 | }, 2289 | "picocolors": { 2290 | "version": "1.0.0", 2291 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2292 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 2293 | }, 2294 | "postcss": { 2295 | "version": "8.4.12", 2296 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", 2297 | "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", 2298 | "requires": { 2299 | "nanoid": "^3.3.1", 2300 | "picocolors": "^1.0.0", 2301 | "source-map-js": "^1.0.2" 2302 | } 2303 | }, 2304 | "process": { 2305 | "version": "0.11.10", 2306 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2307 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 2308 | }, 2309 | "promise": { 2310 | "version": "7.3.1", 2311 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 2312 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 2313 | "dev": true, 2314 | "requires": { 2315 | "asap": "~2.0.3" 2316 | } 2317 | }, 2318 | "pug": { 2319 | "version": "3.0.2", 2320 | "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", 2321 | "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", 2322 | "dev": true, 2323 | "requires": { 2324 | "pug-code-gen": "^3.0.2", 2325 | "pug-filters": "^4.0.0", 2326 | "pug-lexer": "^5.0.1", 2327 | "pug-linker": "^4.0.0", 2328 | "pug-load": "^3.0.0", 2329 | "pug-parser": "^6.0.0", 2330 | "pug-runtime": "^3.0.1", 2331 | "pug-strip-comments": "^2.0.0" 2332 | } 2333 | }, 2334 | "pug-attrs": { 2335 | "version": "3.0.0", 2336 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", 2337 | "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", 2338 | "dev": true, 2339 | "requires": { 2340 | "constantinople": "^4.0.1", 2341 | "js-stringify": "^1.0.2", 2342 | "pug-runtime": "^3.0.0" 2343 | } 2344 | }, 2345 | "pug-code-gen": { 2346 | "version": "3.0.2", 2347 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", 2348 | "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", 2349 | "dev": true, 2350 | "requires": { 2351 | "constantinople": "^4.0.1", 2352 | "doctypes": "^1.1.0", 2353 | "js-stringify": "^1.0.2", 2354 | "pug-attrs": "^3.0.0", 2355 | "pug-error": "^2.0.0", 2356 | "pug-runtime": "^3.0.0", 2357 | "void-elements": "^3.1.0", 2358 | "with": "^7.0.0" 2359 | } 2360 | }, 2361 | "pug-error": { 2362 | "version": "2.0.0", 2363 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", 2364 | "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", 2365 | "dev": true 2366 | }, 2367 | "pug-filters": { 2368 | "version": "4.0.0", 2369 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", 2370 | "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", 2371 | "dev": true, 2372 | "requires": { 2373 | "constantinople": "^4.0.1", 2374 | "jstransformer": "1.0.0", 2375 | "pug-error": "^2.0.0", 2376 | "pug-walk": "^2.0.0", 2377 | "resolve": "^1.15.1" 2378 | } 2379 | }, 2380 | "pug-lexer": { 2381 | "version": "5.0.1", 2382 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", 2383 | "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", 2384 | "dev": true, 2385 | "requires": { 2386 | "character-parser": "^2.2.0", 2387 | "is-expression": "^4.0.0", 2388 | "pug-error": "^2.0.0" 2389 | } 2390 | }, 2391 | "pug-linker": { 2392 | "version": "4.0.0", 2393 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", 2394 | "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", 2395 | "dev": true, 2396 | "requires": { 2397 | "pug-error": "^2.0.0", 2398 | "pug-walk": "^2.0.0" 2399 | } 2400 | }, 2401 | "pug-load": { 2402 | "version": "3.0.0", 2403 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", 2404 | "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", 2405 | "dev": true, 2406 | "requires": { 2407 | "object-assign": "^4.1.1", 2408 | "pug-walk": "^2.0.0" 2409 | } 2410 | }, 2411 | "pug-parser": { 2412 | "version": "6.0.0", 2413 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", 2414 | "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", 2415 | "dev": true, 2416 | "requires": { 2417 | "pug-error": "^2.0.0", 2418 | "token-stream": "1.0.0" 2419 | } 2420 | }, 2421 | "pug-runtime": { 2422 | "version": "3.0.1", 2423 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", 2424 | "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", 2425 | "dev": true 2426 | }, 2427 | "pug-strip-comments": { 2428 | "version": "2.0.0", 2429 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", 2430 | "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", 2431 | "dev": true, 2432 | "requires": { 2433 | "pug-error": "^2.0.0" 2434 | } 2435 | }, 2436 | "pug-walk": { 2437 | "version": "2.0.0", 2438 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", 2439 | "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", 2440 | "dev": true 2441 | }, 2442 | "request-light": { 2443 | "version": "0.5.8", 2444 | "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", 2445 | "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", 2446 | "dev": true 2447 | }, 2448 | "resolve": { 2449 | "version": "1.22.0", 2450 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 2451 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 2452 | "dev": true, 2453 | "requires": { 2454 | "is-core-module": "^2.8.1", 2455 | "path-parse": "^1.0.7", 2456 | "supports-preserve-symlinks-flag": "^1.0.0" 2457 | } 2458 | }, 2459 | "rollup": { 2460 | "version": "2.70.1", 2461 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", 2462 | "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", 2463 | "dev": true, 2464 | "requires": { 2465 | "fsevents": "~2.3.2" 2466 | } 2467 | }, 2468 | "semver": { 2469 | "version": "7.3.7", 2470 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 2471 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 2472 | "dev": true, 2473 | "requires": { 2474 | "lru-cache": "^6.0.0" 2475 | } 2476 | }, 2477 | "source-map": { 2478 | "version": "0.6.1", 2479 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2480 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 2481 | }, 2482 | "source-map-js": { 2483 | "version": "1.0.2", 2484 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2485 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 2486 | }, 2487 | "sourcemap-codec": { 2488 | "version": "1.4.8", 2489 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 2490 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 2491 | }, 2492 | "supports-preserve-symlinks-flag": { 2493 | "version": "1.0.0", 2494 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2495 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2496 | "dev": true 2497 | }, 2498 | "to-fast-properties": { 2499 | "version": "2.0.0", 2500 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2501 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2502 | "dev": true 2503 | }, 2504 | "token-stream": { 2505 | "version": "1.0.0", 2506 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", 2507 | "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", 2508 | "dev": true 2509 | }, 2510 | "typescript": { 2511 | "version": "4.6.3", 2512 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", 2513 | "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", 2514 | "dev": true 2515 | }, 2516 | "upath": { 2517 | "version": "2.0.1", 2518 | "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", 2519 | "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", 2520 | "dev": true 2521 | }, 2522 | "util": { 2523 | "version": "0.10.4", 2524 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 2525 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 2526 | "requires": { 2527 | "inherits": "2.0.3" 2528 | } 2529 | }, 2530 | "vite": { 2531 | "version": "2.9.1", 2532 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", 2533 | "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", 2534 | "dev": true, 2535 | "requires": { 2536 | "esbuild": "^0.14.27", 2537 | "fsevents": "~2.3.2", 2538 | "postcss": "^8.4.12", 2539 | "resolve": "^1.22.0", 2540 | "rollup": "^2.59.0" 2541 | } 2542 | }, 2543 | "void-elements": { 2544 | "version": "3.1.0", 2545 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", 2546 | "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", 2547 | "dev": true 2548 | }, 2549 | "vscode-css-languageservice": { 2550 | "version": "5.4.1", 2551 | "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-5.4.1.tgz", 2552 | "integrity": "sha512-W7D3GKFXf97ReAaU4EZ2nxVO1kQhztbycJgc1b/Ipr0h8zYWr88BADmrXu02z+lsCS84D7Sr4hoUzDKeaFn2Kg==", 2553 | "dev": true, 2554 | "requires": { 2555 | "vscode-languageserver-textdocument": "^1.0.4", 2556 | "vscode-languageserver-types": "^3.16.0", 2557 | "vscode-nls": "^5.0.0", 2558 | "vscode-uri": "^3.0.3" 2559 | } 2560 | }, 2561 | "vscode-html-languageservice": { 2562 | "version": "4.2.4", 2563 | "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-4.2.4.tgz", 2564 | "integrity": "sha512-1HqvXKOq9WlZyW4HTD+0XzrjZoZ/YFrgQY2PZqktbRloHXVAUKm6+cAcvZi4YqKPVn05/CK7do+KBHfuSaEdbg==", 2565 | "dev": true, 2566 | "requires": { 2567 | "vscode-languageserver-textdocument": "^1.0.4", 2568 | "vscode-languageserver-types": "^3.16.0", 2569 | "vscode-nls": "^5.0.0", 2570 | "vscode-uri": "^3.0.3" 2571 | } 2572 | }, 2573 | "vscode-json-languageservice": { 2574 | "version": "4.2.1", 2575 | "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", 2576 | "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", 2577 | "dev": true, 2578 | "requires": { 2579 | "jsonc-parser": "^3.0.0", 2580 | "vscode-languageserver-textdocument": "^1.0.3", 2581 | "vscode-languageserver-types": "^3.16.0", 2582 | "vscode-nls": "^5.0.0", 2583 | "vscode-uri": "^3.0.3" 2584 | }, 2585 | "dependencies": { 2586 | "jsonc-parser": { 2587 | "version": "3.0.0", 2588 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", 2589 | "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", 2590 | "dev": true 2591 | } 2592 | } 2593 | }, 2594 | "vscode-jsonrpc": { 2595 | "version": "8.0.0-next.7", 2596 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.0-next.7.tgz", 2597 | "integrity": "sha512-JX/F31LEsims0dAlOTKFE4E+AJMiJvdRSRViifFJSqSN7EzeYyWlfuDchF7g91oRNPZOIWfibTkDf3/UMsQGzQ==", 2598 | "dev": true 2599 | }, 2600 | "vscode-languageserver": { 2601 | "version": "8.0.0-next.10", 2602 | "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.0-next.10.tgz", 2603 | "integrity": "sha512-sdjldl9ipuBSWVw5ENVMRcOVQwF0o+J6+lNA7FrB8MiLmzflnfjRoJMqA5tCEY8S/J/+P56ZR/dqiQnRYg5m8w==", 2604 | "dev": true, 2605 | "requires": { 2606 | "vscode-languageserver-protocol": "3.17.0-next.16" 2607 | } 2608 | }, 2609 | "vscode-languageserver-protocol": { 2610 | "version": "3.17.0-next.16", 2611 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.0-next.16.tgz", 2612 | "integrity": "sha512-tx4DnXw9u3N7vw+bx6n2NKp6FoxoNwiP/biH83AS30I2AnTGyLd7afSeH6Oewn2E8jvB7K15bs12sMppkKOVeQ==", 2613 | "dev": true, 2614 | "requires": { 2615 | "vscode-jsonrpc": "8.0.0-next.7", 2616 | "vscode-languageserver-types": "3.17.0-next.9" 2617 | }, 2618 | "dependencies": { 2619 | "vscode-languageserver-types": { 2620 | "version": "3.17.0-next.9", 2621 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.9.tgz", 2622 | "integrity": "sha512-9/PeDNPYduaoXRUzYpqmu4ZV9L01HGo0wH9FUt+sSHR7IXwA7xoXBfNUlv8gB9H0D2WwEmMomSy1NmhjKQyn3A==", 2623 | "dev": true 2624 | } 2625 | } 2626 | }, 2627 | "vscode-languageserver-textdocument": { 2628 | "version": "1.0.4", 2629 | "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz", 2630 | "integrity": "sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==", 2631 | "dev": true 2632 | }, 2633 | "vscode-languageserver-types": { 2634 | "version": "3.16.0", 2635 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", 2636 | "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", 2637 | "dev": true 2638 | }, 2639 | "vscode-nls": { 2640 | "version": "5.0.0", 2641 | "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", 2642 | "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", 2643 | "dev": true 2644 | }, 2645 | "vscode-pug-languageservice": { 2646 | "version": "0.29.8", 2647 | "resolved": "https://registry.npmjs.org/vscode-pug-languageservice/-/vscode-pug-languageservice-0.29.8.tgz", 2648 | "integrity": "sha512-QHYAzDSJLg7GOLxCZ12qsM0dAM0dPeMSS1t4kKfzLsfpErmZpFzkAIXbidVrNMdMffGZMtTuIlcpEyWHbx96Iw==", 2649 | "dev": true, 2650 | "requires": { 2651 | "@volar/code-gen": "0.29.8", 2652 | "@volar/shared": "0.29.8", 2653 | "@volar/source-map": "0.29.8", 2654 | "@volar/transforms": "0.29.8", 2655 | "pug-lexer": "^5.0.1", 2656 | "pug-parser": "^6.0.0", 2657 | "vscode-languageserver": "^8.0.0-next.2" 2658 | } 2659 | }, 2660 | "vscode-typescript-languageservice": { 2661 | "version": "0.29.8", 2662 | "resolved": "https://registry.npmjs.org/vscode-typescript-languageservice/-/vscode-typescript-languageservice-0.29.8.tgz", 2663 | "integrity": "sha512-eecDqHk4WjEvy6VHQ6teHczppQ9yJO2wExCy7yu7WiFj35qbw0h4G6Erv46MvP3ClL8FggFzD7s1qM6vdqJUfw==", 2664 | "dev": true, 2665 | "requires": { 2666 | "@volar/shared": "0.29.8", 2667 | "semver": "^7.3.5", 2668 | "upath": "^2.0.1", 2669 | "vscode-languageserver": "^8.0.0-next.2", 2670 | "vscode-languageserver-textdocument": "^1.0.1" 2671 | } 2672 | }, 2673 | "vscode-uri": { 2674 | "version": "3.0.3", 2675 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz", 2676 | "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==", 2677 | "dev": true 2678 | }, 2679 | "vscode-vue-languageservice": { 2680 | "version": "0.29.8", 2681 | "resolved": "https://registry.npmjs.org/vscode-vue-languageservice/-/vscode-vue-languageservice-0.29.8.tgz", 2682 | "integrity": "sha512-qSJdvW5ttyGUB/8uWDKgo8vnIoFnXYlBP4Z/cn54btsRn6ZMw7IJGJU1381e7p/yGvMTLeGbugD53SghbnSa6g==", 2683 | "dev": true, 2684 | "requires": { 2685 | "@volar/code-gen": "0.29.8", 2686 | "@volar/html2pug": "0.29.8", 2687 | "@volar/shared": "0.29.8", 2688 | "@volar/source-map": "0.29.8", 2689 | "@volar/transforms": "0.29.8", 2690 | "@volar/vue-code-gen": "0.29.8", 2691 | "@vscode/emmet-helper": "^2.8.0", 2692 | "@vue/reactivity": "^3.2.21", 2693 | "@vue/shared": "^3.2.21", 2694 | "request-light": "^0.5.4", 2695 | "upath": "^2.0.1", 2696 | "vscode-css-languageservice": "^5.1.7", 2697 | "vscode-html-languageservice": "^4.1.0", 2698 | "vscode-json-languageservice": "^4.1.8", 2699 | "vscode-languageserver": "^8.0.0-next.2", 2700 | "vscode-languageserver-textdocument": "^1.0.1", 2701 | "vscode-pug-languageservice": "0.29.8", 2702 | "vscode-typescript-languageservice": "0.29.8" 2703 | } 2704 | }, 2705 | "vue": { 2706 | "version": "3.2.32", 2707 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.32.tgz", 2708 | "integrity": "sha512-6L3jKZApF042OgbCkh+HcFeAkiYi3Lovi8wNhWqIK98Pi5efAMLZzRHgi91v+60oIRxdJsGS9sTMsb+yDpY8Eg==", 2709 | "requires": { 2710 | "@vue/compiler-dom": "3.2.32", 2711 | "@vue/compiler-sfc": "3.2.32", 2712 | "@vue/runtime-dom": "3.2.32", 2713 | "@vue/server-renderer": "3.2.32", 2714 | "@vue/shared": "3.2.32" 2715 | } 2716 | }, 2717 | "vue-tsc": { 2718 | "version": "0.29.8", 2719 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.29.8.tgz", 2720 | "integrity": "sha512-pT0wLRjvRuSmB+J4WJT6uuV9mO0KtSSXEAtaVXZQzyk5+DJdbLIQTbRce/TXSkfqt1l1WogO78RjtOJFiMCgfQ==", 2721 | "dev": true, 2722 | "requires": { 2723 | "@volar/shared": "0.29.8", 2724 | "vscode-vue-languageservice": "0.29.8" 2725 | } 2726 | }, 2727 | "with": { 2728 | "version": "7.0.2", 2729 | "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", 2730 | "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", 2731 | "dev": true, 2732 | "requires": { 2733 | "@babel/parser": "^7.9.6", 2734 | "@babel/types": "^7.9.6", 2735 | "assert-never": "^1.2.1", 2736 | "babel-walk": "3.0.0-canary-5" 2737 | } 2738 | }, 2739 | "yallist": { 2740 | "version": "4.0.0", 2741 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2742 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2743 | "dev": true 2744 | } 2745 | } 2746 | } 2747 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graph", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vue-tsc --noEmit && vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "path": "^0.12.7", 12 | "vue": "^3.2.25" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^2.3.0", 16 | "typescript": "^4.5.4", 17 | "vite": "^2.9.0", 18 | "vue-tsc": "^0.29.8" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/app.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 70 | 71 | -------------------------------------------------------------------------------- /src/app/graphics.ts: -------------------------------------------------------------------------------- 1 | import { draw_circle } from '@/entities/circle' 2 | import { point } from '@/entities/point' 3 | 4 | export const graphicsData = { 5 | screen:null, 6 | circles:[], 7 | nodes:[], 8 | connections:[], 9 | lines:[], 10 | style:null, 11 | node_odd_count:[], 12 | } 13 | 14 | export const graphicsMethods = { 15 | 16 | draw() 17 | { 18 | const ctx : CanvasRenderingContext2D = this.screen.getContext('2d') 19 | ctx.clearRect(0,0,this.screen.width,this.screen.height) 20 | 21 | if(this.connect_point) 22 | { 23 | this.draw_line(ctx,this.connect_point.position,this.mouse) 24 | } 25 | 26 | for(const connection of this.connections) 27 | { 28 | this.draw_line(ctx,this.nodes[connection.from].position,this.nodes[connection.to].position) 29 | } 30 | 31 | for(const point of this.nodes) 32 | { 33 | draw_circle(ctx, point.circle, point.position) 34 | ctx.fillStyle = 'white'; 35 | ctx.textAlign = "center"; 36 | // ctx.fillText(this.node_odd_count[this.nodes.indexOf(point)].toFixed(), point.position.x, point.position.y+3); 37 | // ctx.fillText(this.nodes.indexOf(point).toFixed(), point.position.x, point.position.y+3); 38 | } 39 | 40 | }, 41 | 42 | draw_line(ctx:CanvasRenderingContext2D, from:point, to:point) 43 | { 44 | ctx.beginPath() 45 | ctx.moveTo(from.x,from.y) 46 | ctx.lineTo(to.x,to.y) 47 | ctx.lineWidth = 7 48 | ctx.strokeStyle = this.style.getPropertyValue('--bright'), 49 | ctx.stroke() 50 | ctx.lineWidth = 3 51 | ctx.strokeStyle = this.style.getPropertyValue('--medium'), 52 | ctx.stroke() 53 | }, 54 | 55 | update_colors() 56 | { 57 | const {graph,solveData} = this.solve(); 58 | this.solveData = solveData; 59 | // this.node_odd_count = node_odd_count 60 | for (let i = 0; i < this.nodes.length; i++) 61 | { 62 | this.nodes[i].circle = this.circles[graph[i]]; 63 | } 64 | }, 65 | 66 | } -------------------------------------------------------------------------------- /src/app/keyboard.ts: -------------------------------------------------------------------------------- 1 | export const keyboardData = { 2 | keys: {}, 3 | } 4 | 5 | export const keyboardMethods = { 6 | 7 | onKeyDown(e:KeyboardEvent) 8 | { 9 | this.keys[e.key] = true 10 | 11 | if(e.ctrlKey) 12 | { 13 | if(e.key == 's') 14 | { 15 | e.preventDefault() 16 | e.stopPropagation() 17 | const save_file = new File([ 18 | JSON.stringify( 19 | { 20 | nodes:this.nodes.map(node => node.position), 21 | connections:this.connections, 22 | selected: this.solveData.selected, 23 | colorHistory: this.solveData.colorHistory, 24 | }) 25 | ], 'save.json', {type: 'application/json'}) 26 | const save_link = document.createElement('a') 27 | save_link.href = URL.createObjectURL(save_file) 28 | save_link.download = 'graph.json' 29 | save_link.click() 30 | save_link.remove() 31 | this.keys['Control'] = false 32 | this.keys[e.key] = false 33 | } 34 | 35 | if(e.key == 'l') 36 | { 37 | e.preventDefault() 38 | e.stopPropagation() 39 | const load_file = document.createElement('input') 40 | load_file.type = 'file' 41 | load_file.accept = 'application/json' 42 | load_file.onchange = (e) => 43 | { 44 | const file = (e.target as HTMLInputElement) .files[0] 45 | const reader = new FileReader() 46 | reader.onload = (e) => 47 | { 48 | const {connections,nodes} = JSON.parse(reader.result as string) 49 | this.connections = connections 50 | this.nodes = nodes 51 | this.parse_saved_nodes() 52 | this.update_colors() 53 | this.save() 54 | this.draw() 55 | } 56 | reader.readAsText(file) 57 | } 58 | load_file.click() 59 | load_file.remove() 60 | this.keys['Control'] = false 61 | this.keys[e.key] = false 62 | } 63 | 64 | if(e.key == 'c') 65 | { 66 | e.preventDefault() 67 | e.stopPropagation() 68 | this.connections = [] 69 | this.nodes = [] 70 | this.save() 71 | this.draw() 72 | this.keys['Control'] = false 73 | this.keys[e.key] = false 74 | } 75 | } 76 | }, 77 | 78 | onKeyUp(e:KeyboardEvent) 79 | { 80 | this.keys[e.key] = false 81 | 82 | } 83 | } -------------------------------------------------------------------------------- /src/app/mouse.ts: -------------------------------------------------------------------------------- 1 | import { pointDistance } from '@/entities/point' 2 | 3 | export const mouseData = { 4 | drag_point:null, 5 | connect_point:null, 6 | drag_offset:null, 7 | mouse:null, 8 | drag_all_offsets:null, 9 | } 10 | 11 | export const mouseMethods = { 12 | 13 | onMouseDown(e:MouseEvent) 14 | { 15 | e.preventDefault() 16 | this.updateMousePosition(e) 17 | let point = this.nodes.find(p => pointDistance(p.position,this.mouse) < p.circle.radius) 18 | if(point) 19 | { 20 | switch(e.button) 21 | { 22 | // drag 23 | case 0: 24 | this.drag_point = point 25 | this.drag_offset = { 26 | x: point.position.x - this.mouse.x, 27 | y: point.position.y - this.mouse.y 28 | } 29 | break; 30 | // connect 31 | case 1: 32 | this.connect_point = point 33 | break; 34 | // delete 35 | case 2: 36 | { 37 | const delete_node = this.nodes.indexOf(point) 38 | this.connections = this.connections.filter(connection => connection.from != delete_node && connection.to != delete_node) 39 | if(!this.keys['Control']) 40 | { 41 | this.nodes.splice(delete_node,1) 42 | this.connections = this.connections.map(connection => { 43 | if(connection.from > delete_node) connection.from--; 44 | if(connection.to > delete_node) connection.to-- 45 | return connection 46 | }) 47 | } 48 | this.save() 49 | this.update_colors() 50 | this.draw() 51 | } 52 | 53 | break; 54 | } 55 | } 56 | // new 57 | else if(e.button == 0) 58 | { 59 | point = { 60 | circle: this.circles[0], 61 | position: this.mouse, 62 | } 63 | this.drag_offset = { 64 | x: 0, 65 | y: 0 66 | } 67 | point.position.x = this.mouse.x 68 | point.position.y = this.mouse.y 69 | this.nodes.push(point) 70 | this.save() 71 | this.update_colors() 72 | this.draw() 73 | this.drag_point = point 74 | }else if(e.button == 1) 75 | { 76 | point = { 77 | circle: this.circles[0], 78 | position: this.mouse, 79 | } 80 | this.nodes.push(point) 81 | this.connect_point = point 82 | }else if(e.button == 2) 83 | { 84 | this.drag_all_offsets = [] 85 | for(const node of this.nodes) 86 | { 87 | this.drag_all_offsets.push({ 88 | x: node.position.x - this.mouse.x, 89 | y: node.position.y - this.mouse.y 90 | }) 91 | } 92 | } 93 | }, 94 | 95 | onMouseMove(e:MouseEvent) 96 | { 97 | this.updateMousePosition(e) 98 | // on drag 99 | if(this.drag_point) 100 | { 101 | this.drag_point.position.x = this.mouse.x + this.drag_offset.x 102 | this.drag_point.position.y = this.mouse.y + this.drag_offset.y 103 | this.draw() 104 | } 105 | // on connect 106 | if(this.connect_point) 107 | { 108 | this.draw() 109 | } 110 | if(this.drag_all_offsets) 111 | { 112 | for(let i = 0; i < this.nodes.length; i++) 113 | { 114 | this.nodes[i].position.x = this.mouse.x + this.drag_all_offsets[i].x 115 | this.nodes[i].position.y = this.mouse.y + this.drag_all_offsets[i].y 116 | } 117 | this.draw() 118 | } 119 | }, 120 | 121 | onMouseUp(e:MouseEvent) 122 | { 123 | this.updateMousePosition(e) 124 | // end connect 125 | if(this.connect_point) 126 | { 127 | const point = this.nodes.find(p => pointDistance(p.position,this.mouse) < p.circle.radius) 128 | if(point) 129 | { 130 | const from = this.nodes.indexOf(this.connect_point) 131 | const to = this.nodes.indexOf(point) 132 | if(this.connect_point != point && !this.connections.some( 133 | connection => 134 | (connection.from == from && connection.to == to || 135 | (connection.to == from && connection.from == to) 136 | ) 137 | )) 138 | 139 | { 140 | this.connections.push({ 141 | from: from, 142 | to: to, 143 | }) 144 | this.update_colors() 145 | } 146 | } 147 | else 148 | { 149 | const node = { 150 | circle: this.circles[0], 151 | position: this.mouse, 152 | } 153 | this.nodes.push(node) 154 | this.connections.push({ 155 | from: this.nodes.indexOf(this.connect_point), 156 | to: this.nodes.indexOf(node), 157 | }) 158 | this.update_colors() 159 | } 160 | } 161 | // clear state 162 | this.drag_point = null 163 | this.connect_point = null 164 | this.drag_all_offsets = null 165 | this.save() 166 | this.draw() 167 | }, 168 | 169 | updateMousePosition(e:MouseEvent) 170 | { 171 | this.screen.focus() 172 | const { offsetX, offsetY } = e 173 | this.mouse = { 174 | x: offsetX, 175 | y: offsetY 176 | } 177 | } 178 | } -------------------------------------------------------------------------------- /src/app/persistence.ts: -------------------------------------------------------------------------------- 1 | 2 | export const persistenceMethods = { 3 | 4 | save() 5 | { 6 | localStorage.setItem('nodes', JSON.stringify(this.nodes.map(node => node.position))) 7 | localStorage.setItem('connections', JSON.stringify(this.connections)) 8 | }, 9 | 10 | load() 11 | { 12 | this.nodes = JSON.parse(window.localStorage.getItem('nodes')) || [] 13 | this.parse_saved_nodes() 14 | this.connections = JSON.parse(window.localStorage.getItem('connections')) || [] 15 | this.update_colors() 16 | }, 17 | 18 | parse_saved_nodes() 19 | { 20 | this.nodes = this.nodes.map(node => {return {position:node}}) 21 | }, 22 | } -------------------------------------------------------------------------------- /src/app/solve.ts: -------------------------------------------------------------------------------- 1 | export const solveMethods = { 2 | 3 | solve() 4 | { 5 | let dull : number[] = []; 6 | const graph : number[] = []; 7 | for (let i = 0; i < this.nodes.length; i++) 8 | { 9 | graph.push(0); 10 | dull.push(i); 11 | } 12 | 13 | //creates a array with all connections each node have 14 | const connections: number[][] = []; 15 | 16 | for (let i = 0; i < graph.length; i++) 17 | connections.push([]); 18 | 19 | for (let i = 0; i < this.connections.length; i++) 20 | { 21 | connections[this.connections[i].to].push(this.connections[i].from); 22 | connections[this.connections[i].from].push(this.connections[i].to); 23 | } 24 | 25 | console.clear(); 26 | const oddLoops = []; 27 | const oddLoopDict = new Set(); 28 | 29 | for(const node of dull) 30 | { 31 | dfs(node,node,[],new Set()) 32 | } 33 | function dfs(current,start,path,visited) 34 | { 35 | visited.add(current) 36 | path.push(current) 37 | for(const neighbour of connections[current]) 38 | { 39 | if(!visited.has(neighbour)) 40 | { 41 | dfs(neighbour,start,[...path],visited) 42 | } 43 | else if(neighbour == start && path.length > 2) 44 | { 45 | var key = [...path].sort().join(',') 46 | if(path.length % 2 == 1) 47 | { 48 | if(!oddLoopDict.has(key)) 49 | { 50 | oddLoopDict.add(key) 51 | oddLoops.push([...path]) 52 | } 53 | } 54 | 55 | } 56 | } 57 | } 58 | 59 | 60 | function getGraphOddLoopCount() 61 | { 62 | const graphOddLoopCount = Array(graph.length).fill(0); 63 | 64 | for(const loop of oddLoops) 65 | { 66 | for(const node of loop) 67 | { 68 | graphOddLoopCount[node]++; 69 | } 70 | } 71 | return graphOddLoopCount; 72 | } 73 | 74 | var graphOddLoopCount = getGraphOddLoopCount(); 75 | 76 | 77 | const nodeOddLoops = Array(graph.length).fill(0).map(x => []); 78 | for(var i = 0; i < oddLoops.length; i++) 79 | { 80 | for(const node of oddLoops[i]) 81 | { 82 | nodeOddLoops[node].push(i); 83 | } 84 | } 85 | 86 | 87 | function sortConnections() 88 | { 89 | dull.sort((a,b) => graphOddLoopCount[b] - graphOddLoopCount[a]) 90 | for(const connection of connections) 91 | { 92 | connection.sort((a,b) => graphOddLoopCount[b] - graphOddLoopCount[a]) 93 | } 94 | } 95 | 96 | sortConnections() 97 | 98 | let current_color = 0; 99 | let working = true; 100 | const done = Array(graph.length).fill(false); 101 | 102 | function removeDone() 103 | { 104 | for(var i = 0; i < dull.length; i++) 105 | { 106 | if(done[dull[i]]) 107 | { 108 | for(var loop of nodeOddLoops[dull[i]]) 109 | { 110 | oddLoops[loop] = [] 111 | } 112 | dull.splice(i,1) 113 | i--; 114 | } 115 | } 116 | for(const connection of connections) 117 | { 118 | for(var i = 0; i < connection.length; i++) 119 | { 120 | if(done[connection[i]]) 121 | { 122 | connection.splice(i,1) 123 | i--; 124 | } 125 | } 126 | } 127 | } 128 | 129 | // DEBUG CODE NOT PART OF THE ALGORITHM 130 | var data = {selected:[],colorHistory:[]} 131 | // END OF DEBUG CODE 132 | 133 | while (working) 134 | { 135 | working = false 136 | for(const node of dull) 137 | { 138 | active(node) 139 | } 140 | 141 | function active(node) 142 | { 143 | if(graph[node] == current_color && !done[node]) 144 | { 145 | working = true 146 | const passive_nodes = [] 147 | done[node] = true 148 | for(const connection of connections[node]) 149 | { 150 | if(graph[connection] === current_color) 151 | { 152 | graph[connection]++ 153 | passive_nodes.push(connection) 154 | } 155 | } 156 | // DEBUG CODE NOT PART OF THE ALGORITHM 157 | data.selected.push(node) 158 | data.colorHistory.push([...graph]) 159 | // END OF DEBUG CODE 160 | for(const node of passive_nodes) 161 | { 162 | for(const connection of connections[node]) 163 | { 164 | active(connection) 165 | } 166 | } 167 | } 168 | } 169 | removeDone() 170 | graphOddLoopCount = getGraphOddLoopCount(); 171 | sortConnections() 172 | current_color++; 173 | } 174 | 175 | return {graph, solveData: data} 176 | 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /src/entities/circle.ts: -------------------------------------------------------------------------------- 1 | import { point } from "./point"; 2 | 3 | export interface circle{ 4 | radius: number; 5 | border_radius: number; 6 | surface: HTMLCanvasElement; 7 | } 8 | // let i = 0; 9 | 10 | export function bake_circle(props:any=null) 11 | { 12 | const border_radius = props?.border_radius || 2; 13 | const radius = props?.radius || 12; 14 | const color = props?.color || '#ccc'; 15 | const border_color = props?.border_color || '#fff'; 16 | 17 | const surface = document.createElement('canvas'); 18 | surface.width = radius * 2 + border_radius * 2; 19 | surface.height = radius * 2 + border_radius * 2; 20 | 21 | const ctx = surface.getContext('2d'); 22 | ctx.fillStyle = color; 23 | ctx.strokeStyle = border_color; 24 | ctx.lineWidth = border_radius; 25 | ctx.beginPath(); 26 | ctx.arc(radius + border_radius, radius + border_radius, radius, 0, 2 * Math.PI); 27 | ctx.closePath(); 28 | ctx.fill(); 29 | ctx.stroke(); 30 | // ctx.fillStyle = 'gray'; 31 | // ctx.fillText((++i).toString(), radius + border_radius, radius + border_radius); 32 | return {surface,radius,border_radius} as circle; 33 | } 34 | 35 | export function draw_circle(ctx:CanvasRenderingContext2D,circle:circle, position:point) 36 | { 37 | ctx.drawImage(circle.surface, position.x-circle.radius-circle.border_radius, position.y-circle.radius-circle.border_radius); 38 | } -------------------------------------------------------------------------------- /src/entities/node.ts: -------------------------------------------------------------------------------- 1 | import { circle } from './circle' 2 | import { point, } from './point' 3 | 4 | interface node{ 5 | circle: circle, 6 | position: point, 7 | } -------------------------------------------------------------------------------- /src/entities/point.ts: -------------------------------------------------------------------------------- 1 | export interface point{ 2 | x:number; 3 | y:number; 4 | } 5 | 6 | export function pointDistance(a:point, b:point) 7 | { 8 | const {x:x1,y:y1} = a; 9 | const {x:x2,y:y2} = b; 10 | return Math.sqrt( Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) ); 11 | } -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import type { DefineComponent } from 'vue' 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 6 | const component: DefineComponent<{}, {}, any> 7 | export default component 8 | } 9 | -------------------------------------------------------------------------------- /src/main.css: -------------------------------------------------------------------------------- 1 | *{ 2 | --dark-selection:rgb(20, 25, 34); 3 | --dark:rgb(24, 24, 24); 4 | --medium:rgb(36, 36, 36); 5 | --bright:rgb(85, 85, 85); 6 | } 7 | body{ 8 | background-color: var(--dark); 9 | color:white; 10 | } 11 | :root { 12 | color-scheme: dark; 13 | } 14 | 15 | .icon{ 16 | filter:invert(1); 17 | } 18 | body{ 19 | overflow: hidden 20 | } 21 | 22 | input.form-control{ 23 | background-color: var(--dark); 24 | border:1px solid var(--bright); 25 | color: white; 26 | } 27 | input.form-control:focus{ 28 | border:1px solid var(--bright); 29 | background-color: var(--dark); 30 | color: white; 31 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './app/app.vue' 3 | import './main.css' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "strict": false, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "baseUrl": "./", 11 | "resolveJsonModule": true, 12 | "esModuleInterop": true, 13 | "lib": ["esnext", "dom"], 14 | "paths": { 15 | "@/*": [ 16 | "src/*" 17 | ], 18 | } 19 | }, 20 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 21 | "references": [{ "path": "./tsconfig.node.json" }] 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "esnext", 5 | "moduleResolution": "node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import path from 'path' 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | plugins: [vue()], 8 | base: '/graph-coloring/', 9 | resolve: { 10 | alias: { 11 | '@': path.resolve(__dirname, './src'), 12 | }, 13 | } 14 | }) 15 | --------------------------------------------------------------------------------