yourname 1 ماه پیش
والد
کامیت
3d6d54a813
34فایلهای تغییر یافته به همراه12982 افزوده شده و 2 حذف شده
  1. 3 2
      .claude/settings.local.json
  2. 0 0
      plant2-demo/datav/assets/css/element-plus-12e19b9b.css
  3. 0 0
      plant2-demo/datav/assets/css/index-de466de5.css
  4. 0 0
      plant2-demo/datav/assets/css/mapbox-gl-bbaabcf2.css
  5. 1 0
      plant2-demo/datav/assets/css/nprogress-771398e6.css
  6. 1 0
      plant2-demo/datav/assets/css/vue-next-wxlogin-d8a75ef8.css
  7. 97 0
      plant2-demo/datav/assets/js/@ctrl-41c0891e.js
  8. 1 0
      plant2-demo/datav/assets/js/@element-plus-bb6eebe0.js
  9. 174 0
      plant2-demo/datav/assets/js/@floating-ui-f285e0b8.js
  10. 0 0
      plant2-demo/datav/assets/js/@popperjs-b696b006.js
  11. 14 0
      plant2-demo/datav/assets/js/@turf-e5dd68ad.js
  12. 10 0
      plant2-demo/datav/assets/js/@vue-37836d09.js
  13. 0 0
      plant2-demo/datav/assets/js/@vueuse-1ddca6f0.js
  14. 1 0
      plant2-demo/datav/assets/js/async-validator-7d693152.js
  15. 2 0
      plant2-demo/datav/assets/js/d3-array-d83825ab.js
  16. 41 0
      plant2-demo/datav/assets/js/d3-geo-106fc929.js
  17. 0 0
      plant2-demo/datav/assets/js/dayjs-423c4f07.js
  18. 2 0
      plant2-demo/datav/assets/js/deep-pick-omit-418f72d7.js
  19. 2 0
      plant2-demo/datav/assets/js/destr-9c6e2924.js
  20. 1081 0
      plant2-demo/datav/assets/js/echarts-a77f8af6.js
  21. 0 0
      plant2-demo/datav/assets/js/element-plus-842069d4.js
  22. 0 0
      plant2-demo/datav/assets/js/index-6530d0f6.js
  23. 10286 0
      plant2-demo/datav/assets/js/lodash-es-acda58df.js
  24. 6 0
      plant2-demo/datav/assets/js/mapbox-gl-b315653c.js
  25. 2 0
      plant2-demo/datav/assets/js/memoize-one-63ab667a.js
  26. 0 0
      plant2-demo/datav/assets/js/normalize-wheel-es-cf7d7ba7.js
  27. 129 0
      plant2-demo/datav/assets/js/nprogress-85851b89.js
  28. 175 0
      plant2-demo/datav/assets/js/pinia-0c8641d4.js
  29. 6 0
      plant2-demo/datav/assets/js/pinia-plugin-persistedstate-1ec13968.js
  30. 2 0
      plant2-demo/datav/assets/js/vue-demi-71ba0ef2.js
  31. 18 0
      plant2-demo/datav/assets/js/vue-next-wxlogin-91e03b70.js
  32. 928 0
      plant2-demo/datav/assets/js/vue-router-c7cbbcaa.js
  33. 0 0
      plant2-demo/datav/assets/js/zrender-ee9f2f6d.js
  34. 0 0
      plant2-demo/datav/logo.ico

+ 3 - 2
.claude/settings.local.json

@@ -34,9 +34,10 @@
       "Bash(pnpm test:components:*)",
       "Bash(pnpm test:unit:*)",
       "Bash(mkdir:*)",
-      "Bash(xargs sed:*)"
+      "Bash(xargs sed:*)",
+      "Bash(wget:*)"
     ],
     "deny": [],
     "ask": []
   }
-}
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/css/element-plus-12e19b9b.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/css/index-de466de5.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/css/mapbox-gl-bbaabcf2.css


+ 1 - 0
plant2-demo/datav/assets/css/nprogress-771398e6.css

@@ -0,0 +1 @@
+#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}

+ 1 - 0
plant2-demo/datav/assets/css/vue-next-wxlogin-d8a75ef8.css

@@ -0,0 +1 @@
+h3[data-v-750eccfd]{margin:40px 0 0}ul[data-v-750eccfd]{list-style-type:none;padding:0}li[data-v-750eccfd]{display:inline-block;margin:0 10px}a[data-v-750eccfd]{color:#42b983}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 97 - 0
plant2-demo/datav/assets/js/@ctrl-41c0891e.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
plant2-demo/datav/assets/js/@element-plus-bb6eebe0.js


+ 174 - 0
plant2-demo/datav/assets/js/@floating-ui-f285e0b8.js

@@ -0,0 +1,174 @@
+/**
+ * Custom positioning reference element.
+ * @see https://floating-ui.com/docs/virtual-elements
+ */
+const t=Math.min,e=Math.max,n=Math.round,o=Math.floor,i=t=>({x:t,y:t}),r={left:"right",right:"left",bottom:"top",top:"bottom"},l={start:"end",end:"start"};function c(n,o,i){return e(n,t(o,i))}function s(t,e){return"function"==typeof t?t(e):t}function a(t){return t.split("-")[0]}function f(t){return t.split("-")[1]}function u(t){return"x"===t?"y":"x"}function d(t){return"y"===t?"height":"width"}function h(t){return["top","bottom"].includes(a(t))?"y":"x"}function m(t){return u(h(t))}function p(t){return t.replace(/start|end/g,(t=>l[t]))}function g(t){return t.replace(/left|right|bottom|top/g,(t=>r[t]))}function y(t){return"number"!=typeof t?function(t){return{top:0,right:0,bottom:0,left:0,...t}}(t):{top:t,right:t,bottom:t,left:t}}function w(t){const{x:e,y:n,width:o,height:i}=t;return{width:o,height:i,top:n,left:e,right:e+o,bottom:n+i,x:e,y:n}}function x(t,e,n){let{reference:o,floating:i}=t;const r=h(e),l=m(e),c=d(l),s=a(e),u="y"===r,p=o.x+o.width/2-i.width/2,g=o.y+o.height/2-i.height/2,y=o[c]/2-i[c]/2;let w;switch(s){case"top":w={x:p,y:o.y-i.height};break;case"bottom":w={x:p,y:o.y+o.height};break;case"right":w={x:o.x+o.width,y:g};break;case"left":w={x:o.x-i.width,y:g};break;default:w={x:o.x,y:o.y}}switch(f(e)){case"start":w[l]-=y*(n&&u?-1:1);break;case"end":w[l]+=y*(n&&u?-1:1)}return w}
+/**
+ * Computes the `x` and `y` coordinates that will place the floating element
+ * next to a given reference element.
+ *
+ * This export does not have any `platform` interface logic. You will need to
+ * write one for the platform you are using Floating UI with.
+ */
+/**
+ * Resolves with an object of overflow side offsets that determine how much the
+ * element is overflowing a given clipping boundary on each side.
+ * - positive = overflowing the boundary by that number of pixels
+ * - negative = how many pixels left before it will overflow
+ * - 0 = lies flush with the boundary
+ * @see https://floating-ui.com/docs/detectOverflow
+ */
+async function v(t,e){var n;void 0===e&&(e={});const{x:o,y:i,platform:r,rects:l,elements:c,strategy:a}=t,{boundary:f="clippingAncestors",rootBoundary:u="viewport",elementContext:d="floating",altBoundary:h=!1,padding:m=0}=s(e,t),p=y(m),g=c[h?"floating"===d?"reference":"floating":d],x=w(await r.getClippingRect({element:null==(n=await(null==r.isElement?void 0:r.isElement(g)))||n?g:g.contextElement||await(null==r.getDocumentElement?void 0:r.getDocumentElement(c.floating)),boundary:f,rootBoundary:u,strategy:a})),v="floating"===d?{x:o,y:i,width:l.floating.width,height:l.floating.height}:l.reference,b=await(null==r.getOffsetParent?void 0:r.getOffsetParent(c.floating)),R=await(null==r.isElement?void 0:r.isElement(b))&&await(null==r.getScale?void 0:r.getScale(b))||{x:1,y:1},T=w(r.convertOffsetParentRelativeRectToViewportRelativeRect?await r.convertOffsetParentRelativeRectToViewportRelativeRect({elements:c,rect:v,offsetParent:b,strategy:a}):v);return{top:(x.top-T.top+p.top)/R.y,bottom:(T.bottom-x.bottom+p.bottom)/R.y,left:(x.left-T.left+p.left)/R.x,right:(T.right-x.right+p.right)/R.x}}
+/**
+ * Provides data to position an inner element of the floating element so that it
+ * appears centered to the reference element.
+ * @see https://floating-ui.com/docs/arrow
+ */function b(){return"undefined"!=typeof window}function R(t){return E(t)?(t.nodeName||"").toLowerCase():"#document";
+// Mocked nodes in testing environments may not be instances of Node. By
+// returning `#document` an infinite loop won't occur.
+// https://github.com/floating-ui/floating-ui/issues/2317
+}function T(t){var e;return(null==t||null==(e=t.ownerDocument)?void 0:e.defaultView)||window}function L(t){var e;return null==(e=(E(t)?t.ownerDocument:t.document)||window.document)?void 0:e.documentElement}function E(t){return!!b()&&(t instanceof Node||t instanceof T(t).Node)}function A(t){return!!b()&&(t instanceof Element||t instanceof T(t).Element)}function D(t){return!!b()&&(t instanceof HTMLElement||t instanceof T(t).HTMLElement)}function O(t){return!(!b()||"undefined"==typeof ShadowRoot)&&(t instanceof ShadowRoot||t instanceof T(t).ShadowRoot)}function S(t){const{overflow:e,overflowX:n,overflowY:o,display:i}=H(t);return/auto|scroll|overlay|hidden|clip/.test(e+o+n)&&!["inline","contents"].includes(i)}function C(t){return["table","td","th"].includes(R(t))}function P(t){return[":popover-open",":modal"].some((e=>{try{return t.matches(e)}catch(n){return!1}}))}function F(t){const e=k(),n=A(t)?H(t):t;
+// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
+// https://drafts.csswg.org/css-transforms-2/#individual-transforms
+return["transform","translate","scale","rotate","perspective"].some((t=>!!n[t]&&"none"!==n[t]))||!!n.containerType&&"normal"!==n.containerType||!e&&!!n.backdropFilter&&"none"!==n.backdropFilter||!e&&!!n.filter&&"none"!==n.filter||["transform","translate","scale","rotate","perspective","filter"].some((t=>(n.willChange||"").includes(t)))||["paint","layout","strict","content"].some((t=>(n.contain||"").includes(t)))}function k(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function B(t){return["html","body","#document"].includes(R(t))}function H(t){return T(t).getComputedStyle(t)}function W(t){return A(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function V(t){if("html"===R(t))return t;const e=
+// Step into the shadow DOM of the parent of a slotted node.
+t.assignedSlot||
+// DOM Element detected.
+t.parentNode||
+// ShadowRoot detected.
+O(t)&&t.host||
+// Fallback.
+L(t);return O(e)?e.host:e}function M(t){const e=V(t);return B(e)?t.ownerDocument?t.ownerDocument.body:t.body:D(e)&&S(e)?e:M(e)}function z(t,e,n){var o;void 0===e&&(e=[]),void 0===n&&(n=!0);const i=M(t),r=i===(null==(o=t.ownerDocument)?void 0:o.body),l=T(i);if(r){const t=N(l);return e.concat(l,l.visualViewport||[],S(i)?i:[],t&&n?z(t):[])}return e.concat(i,z(i,[],n))}function N(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function I(t){const e=H(t);
+// In testing environments, the `width` and `height` properties are empty
+// strings for SVG elements, returning NaN. Fallback to `0` in this case.
+let o=parseFloat(e.width)||0,i=parseFloat(e.height)||0;const r=D(t),l=r?t.offsetWidth:o,c=r?t.offsetHeight:i,s=n(o)!==l||n(i)!==c;return s&&(o=l,i=c),{width:o,height:i,$:s}}function j(t){return A(t)?t:t.contextElement}function q(t){const e=j(t);if(!D(e))return i(1);const o=e.getBoundingClientRect(),{width:r,height:l,$:c}=I(e);let s=(c?n(o.width):o.width)/r,a=(c?n(o.height):o.height)/l;
+// 0, NaN, or Infinity should always fallback to 1.
+return s&&Number.isFinite(s)||(s=1),a&&Number.isFinite(a)||(a=1),{x:s,y:a}}const X=i(0);function Y(t){const e=T(t);return k()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:X}function $(t,e,n,o){void 0===e&&(e=!1),void 0===n&&(n=!1);const r=t.getBoundingClientRect(),l=j(t);let c=i(1);e&&(o?A(o)&&(c=q(o)):c=q(t));const s=function(t,e,n){return void 0===e&&(e=!1),!(!n||e&&n!==T(t))&&e}(l,n,o)?Y(l):i(0);let a=(r.left+s.x)/c.x,f=(r.top+s.y)/c.y,u=r.width/c.x,d=r.height/c.y;if(l){const t=T(l),e=o&&A(o)?T(o):o;let n=t,i=N(n);for(;i&&o&&e!==n;){const t=q(i),e=i.getBoundingClientRect(),o=H(i),r=e.left+(i.clientLeft+parseFloat(o.paddingLeft))*t.x,l=e.top+(i.clientTop+parseFloat(o.paddingTop))*t.y;a*=t.x,f*=t.y,u*=t.x,d*=t.y,a+=r,f+=l,n=T(i),i=N(n)}}return w({width:u,height:d,x:a,y:f})}
+// If <html> has a CSS width greater than the viewport, then this will be
+// incorrect for RTL.
+function _(t,e){const n=W(t).scrollLeft;return e?e.left+n:$(L(t)).left+n}function G(t,e,n){void 0===n&&(n=!1);const o=t.getBoundingClientRect();return{x:o.left+e.scrollLeft-(n?0:
+// RTL <body> scrollbar.
+_(t,o)),y:o.top+e.scrollTop}}function J(t,n,o){let r;if("viewport"===n)r=function(t,e){const n=T(t),o=L(t),i=n.visualViewport;let r=o.clientWidth,l=o.clientHeight,c=0,s=0;if(i){r=i.width,l=i.height;const t=k();(!t||t&&"fixed"===e)&&(c=i.offsetLeft,s=i.offsetTop)}return{width:r,height:l,x:c,y:s}}
+// Returns the inner client rect, subtracting scrollbars if present.
+(t,o);else if("document"===n)r=
+// Gets the entire size of the scrollable document area, even extending outside
+// of the `<html>` and `<body>` rect bounds if horizontally scrollable.
+function(t){const n=L(t),o=W(t),i=t.ownerDocument.body,r=e(n.scrollWidth,n.clientWidth,i.scrollWidth,i.clientWidth),l=e(n.scrollHeight,n.clientHeight,i.scrollHeight,i.clientHeight);let c=-o.scrollLeft+_(t);const s=-o.scrollTop;return"rtl"===H(i).direction&&(c+=e(n.clientWidth,i.clientWidth)-r),{width:r,height:l,x:c,y:s}}(L(t));else if(A(n))r=function(t,e){const n=$(t,!0,"fixed"===e),o=n.top+t.clientTop,r=n.left+t.clientLeft,l=D(t)?q(t):i(1);return{width:t.clientWidth*l.x,height:t.clientHeight*l.y,x:r*l.x,y:o*l.y}}(n,o);else{const e=Y(t);r={x:n.x-e.x,y:n.y-e.y,width:n.width,height:n.height}}return w(r)}function K(t,e){const n=V(t);return!(n===e||!A(n)||B(n))&&("fixed"===H(n).position||K(n,e))}
+// A "clipping ancestor" is an `overflow` element with the characteristic of
+// clipping (or hiding) child elements. This returns all clipping ancestors
+// of the given element up the tree.
+function Q(t,e,n){const o=D(e),r=L(e),l="fixed"===n,c=$(t,!0,l,e);let s={scrollLeft:0,scrollTop:0};const a=i(0);if(o||!o&&!l)if(("body"!==R(e)||S(r))&&(s=W(e)),o){const t=$(e,!0,l,e);a.x=t.x+e.clientLeft,a.y=t.y+e.clientTop}else r&&(
+// If the <body> scrollbar appears on the left (e.g. RTL systems). Use
+// Firefox with layout.scrollbar.side = 3 in about:config to test this.
+a.x=_(r));const f=!r||o||l?i(0):G(r,s);return{x:c.left+s.scrollLeft-a.x-f.x,y:c.top+s.scrollTop-a.y-f.y,width:c.width,height:c.height}}function U(t){return"static"===H(t).position}function Z(t,e){if(!D(t)||"fixed"===H(t).position)return null;if(e)return e(t);let n=t.offsetParent;
+// Firefox returns the <html> element as the offsetParent if it's non-static,
+// while Chrome and Safari return the <body> element. The <body> element must
+// be used to perform the correct calculations even if the <html> element is
+// non-static.
+return L(t)===n&&(n=n.ownerDocument.body),n}
+// Gets the closest ancestor positioned element. Handles some edge cases,
+// such as table ancestors and cross browser bugs.
+function tt(t,e){const n=T(t);if(P(t))return n;if(!D(t)){let e=V(t);for(;e&&!B(e);){if(A(e)&&!U(e))return e;e=V(e)}return n}let o=Z(t,e);for(;o&&C(o)&&U(o);)o=Z(o,e);return o&&B(o)&&U(o)&&!F(o)?n:o||function(t){let e=V(t);for(;D(e)&&!B(e);){if(F(e))return e;if(P(e))return null;e=V(e)}return null}(t)||n}const et={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){let{elements:e,rect:n,offsetParent:o,strategy:r}=t;const l="fixed"===r,c=L(o),s=!!e&&P(e.floating);if(o===c||s&&l)return n;let a={scrollLeft:0,scrollTop:0},f=i(1);const u=i(0),d=D(o);if((d||!d&&!l)&&(("body"!==R(o)||S(c))&&(a=W(o)),D(o))){const t=$(o);f=q(o),u.x=t.x+o.clientLeft,u.y=t.y+o.clientTop}const h=!c||d||l?i(0):G(c,a,!0);return{width:n.width*f.x,height:n.height*f.y,x:n.x*f.x-a.scrollLeft*f.x+u.x+h.x,y:n.y*f.y-a.scrollTop*f.y+u.y+h.y}},getDocumentElement:L,getClippingRect:
+// Gets the maximum area that the element is visible in due to any number of
+// clipping ancestors.
+function(n){let{element:o,boundary:i,rootBoundary:r,strategy:l}=n;const c=[..."clippingAncestors"===i?P(o)?[]:function(t,e){const n=e.get(t);if(n)return n;let o=z(t,[],!1).filter((t=>A(t)&&"body"!==R(t))),i=null;const r="fixed"===H(t).position;let l=r?V(t):t;
+// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
+for(;A(l)&&!B(l);){const e=H(l),n=F(l);n||"fixed"!==e.position||(i=null),(r?!n&&!i:!n&&"static"===e.position&&i&&["absolute","fixed"].includes(i.position)||S(l)&&!n&&K(t,l))?
+// Drop non-containing blocks.
+o=o.filter((t=>t!==l)):
+// Record last containing block for next iteration.
+i=e,l=V(l)}return e.set(t,o),o}(o,this._c):[].concat(i),r],s=c[0],a=c.reduce(((n,i)=>{const r=J(o,i,l);return n.top=e(r.top,n.top),n.right=t(r.right,n.right),n.bottom=t(r.bottom,n.bottom),n.left=e(r.left,n.left),n}),J(o,s,l));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}},getOffsetParent:tt,getElementRects:async function(t){const e=this.getOffsetParent||tt,n=this.getDimensions,o=await n(t.floating);return{reference:Q(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:o.width,height:o.height}}},getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){const{width:e,height:n}=I(t);return{width:e,height:n}},getScale:q,isElement:A,isRTL:function(t){return"rtl"===H(t).direction}};function nt(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}
+// https://samthor.au/2021/observing-dom/
+/**
+ * Automatically updates the position of the floating element when necessary.
+ * Should only be called when the floating element is mounted on the DOM or
+ * visible on the screen.
+ * @returns cleanup function that should be invoked when the floating element is
+ * removed from the DOM or hidden from the screen.
+ * @see https://floating-ui.com/docs/autoUpdate
+ */
+function ot(n,i,r,l){void 0===l&&(l={});const{ancestorScroll:c=!0,ancestorResize:s=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:f="function"==typeof IntersectionObserver,animationFrame:u=!1}=l,d=j(n),h=c||s?[...d?z(d):[],...z(i)]:[];h.forEach((t=>{c&&t.addEventListener("scroll",r,{passive:!0}),s&&t.addEventListener("resize",r)}));const m=d&&f?function(n,i){let r,l=null;const c=L(n);function s(){var t;clearTimeout(r),null==(t=l)||t.disconnect(),l=null}return function a(f,u){void 0===f&&(f=!1),void 0===u&&(u=1),s();const d=n.getBoundingClientRect(),{left:h,top:m,width:p,height:g}=d;if(f||i(),!p||!g)return;const y={rootMargin:-o(m)+"px "+-o(c.clientWidth-(h+p))+"px "+-o(c.clientHeight-(m+g))+"px "+-o(h)+"px",threshold:e(0,t(1,u))||1};let w=!0;function x(t){const e=t[0].intersectionRatio;if(e!==u){if(!w)return a();e?a(!1,e):
+// If the reference is clipped, the ratio is 0. Throttle the refresh
+// to prevent an infinite loop of updates.
+r=setTimeout((()=>{a(!1,1e-7)}),1e3)}1!==e||nt(d,n.getBoundingClientRect())||
+// It's possible that even though the ratio is reported as 1, the
+// element is not actually fully within the IntersectionObserver's root
+// area anymore. This can happen under performance constraints. This may
+// be a bug in the browser's IntersectionObserver implementation. To
+// work around this, we compare the element's bounding rect now with
+// what it was at the time we created the IntersectionObserver. If they
+// are not equal then the element moved, so we refresh.
+a(),w=!1}
+// Older browsers don't support a `document` as the root and will throw an
+// error.
+try{l=new IntersectionObserver(x,{...y,
+// Handle <iframe>s
+root:c.ownerDocument})}catch(v){l=new IntersectionObserver(x,y)}l.observe(n)}(!0),s}(d,r):null;let p,g=-1,y=null;a&&(y=new ResizeObserver((t=>{let[e]=t;e&&e.target===d&&y&&(
+// Prevent update loops when using the `size` middleware.
+// https://github.com/floating-ui/floating-ui/issues/1740
+y.unobserve(i),cancelAnimationFrame(g),g=requestAnimationFrame((()=>{var t;null==(t=y)||t.observe(i)}))),r()})),d&&!u&&y.observe(d),y.observe(i));let w=u?$(n):null;return u&&function t(){const e=$(n);w&&!nt(w,e)&&r();w=e,p=requestAnimationFrame(t)}(),r(),()=>{var t;h.forEach((t=>{c&&t.removeEventListener("scroll",r),s&&t.removeEventListener("resize",r)})),null==m||m(),null==(t=y)||t.disconnect(),y=null,u&&cancelAnimationFrame(p)}}
+/**
+ * Resolves with an object of overflow side offsets that determine how much the
+ * element is overflowing a given clipping boundary on each side.
+ * - positive = overflowing the boundary by that number of pixels
+ * - negative = how many pixels left before it will overflow
+ * - 0 = lies flush with the boundary
+ * @see https://floating-ui.com/docs/detectOverflow
+ */const it=v,rt=function(t){return void 0===t&&(t=0),{name:"offset",options:t,async fn(e){var n,o;const{x:i,y:r,placement:l,middlewareData:c}=e,u=
+// For type backwards-compatibility, the `OffsetOptions` type was also
+// Derivable.
+await async function(t,e){const{placement:n,platform:o,elements:i}=t,r=await(null==o.isRTL?void 0:o.isRTL(i.floating)),l=a(n),c=f(n),u="y"===h(n),d=["left","top"].includes(l)?-1:1,m=r&&u?-1:1,p=s(e,t);
+// eslint-disable-next-line prefer-const
+let{mainAxis:g,crossAxis:y,alignmentAxis:w}="number"==typeof p?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return c&&"number"==typeof w&&(y="end"===c?-1*w:w),u?{x:y*m,y:g*d}:{x:g*d,y:y*m}}
+/**
+ * Modifies the placement by translating the floating element along the
+ * specified axes.
+ * A number (shorthand for `mainAxis` or distance), or an axes configuration
+ * object may be passed.
+ * @see https://floating-ui.com/docs/offset
+ */(e,t);
+// If the placement is the same and the arrow caused an alignment offset
+// then we don't need to change the positioning coordinates.
+return l===(null==(n=c.offset)?void 0:n.placement)&&null!=(o=c.arrow)&&o.alignmentOffset?{}:{x:i+u.x,y:r+u.y,data:{...u,placement:l}}}}},lt=function(t){return void 0===t&&(t={}),{name:"shift",options:t,async fn(e){const{x:n,y:o,placement:i}=e,{mainAxis:r=!0,crossAxis:l=!1,limiter:f={fn:t=>{let{x:e,y:n}=t;return{x:e,y:n}}},...d}=s(t,e),m={x:n,y:o},p=await v(e,d),g=h(a(i)),y=u(g);let w=m[y],x=m[g];if(r){const t="y"===y?"bottom":"right";w=c(w+p["y"===y?"top":"left"],w,w-p[t])}if(l){const t="y"===g?"bottom":"right";x=c(x+p["y"===g?"top":"left"],x,x-p[t])}const b=f.fn({...e,[y]:w,[g]:x});return{...b,data:{x:b.x-n,y:b.y-o,enabled:{[y]:r,[g]:l}}}}}},ct=function(t){return void 0===t&&(t={}),{name:"flip",options:t,async fn(e){var n,o;const{placement:i,middlewareData:r,rects:l,initialPlacement:c,platform:u,elements:y}=e,{mainAxis:w=!0,crossAxis:x=!0,fallbackPlacements:b,fallbackStrategy:R="bestFit",fallbackAxisSideDirection:T="none",flipAlignment:L=!0,...E}=s(t,e);
+// If a reset by the arrow was caused due to an alignment offset being
+// added, we should skip any logic now since `flip()` has already done its
+// work.
+// https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643
+if(null!=(n=r.arrow)&&n.alignmentOffset)return{};const A=a(i),D=h(c),O=a(c)===c,S=await(null==u.isRTL?void 0:u.isRTL(y.floating)),C=b||(O||!L?[g(c)]:function(t){const e=g(t);return[p(t),e,p(e)]}(c)),P="none"!==T;!b&&P&&C.push(...function(t,e,n,o){const i=f(t);let r=function(t,e,n){const o=["left","right"],i=["right","left"],r=["top","bottom"],l=["bottom","top"];switch(t){case"top":case"bottom":return n?e?i:o:e?o:i;case"left":case"right":return e?r:l;default:return[]}}(a(t),"start"===n,o);return i&&(r=r.map((t=>t+"-"+i)),e&&(r=r.concat(r.map(p)))),r}(c,L,T,S));const F=[c,...C],k=await v(e,E),B=[];let H=(null==(o=r.flip)?void 0:o.overflows)||[];if(w&&B.push(k[A]),x){const t=function(t,e,n){void 0===n&&(n=!1);const o=f(t),i=m(t),r=d(i);let l="x"===i?o===(n?"end":"start")?"right":"left":"start"===o?"bottom":"top";return e.reference[r]>e.floating[r]&&(l=g(l)),[l,g(l)]}(i,l,S);B.push(k[t[0]],k[t[1]])}
+// One or more sides is overflowing.
+if(H=[...H,{placement:i,overflows:B}],!B.every((t=>t<=0))){var W,V;const t=((null==(W=r.flip)?void 0:W.index)||0)+1,e=F[t];if(e)
+// Try next placement and re-run the lifecycle.
+return{data:{index:t,overflows:H},reset:{placement:e}};
+// First, find the candidates that fit on the mainAxis side of overflow,
+// then find the placement that fits the best on the main crossAxis side.
+let n=null==(V=H.filter((t=>t.overflows[0]<=0)).sort(((t,e)=>t.overflows[1]-e.overflows[1]))[0])?void 0:V.placement;
+// Otherwise fallback.
+if(!n)switch(R){case"bestFit":{var M;const t=null==(M=H.filter((t=>{if(P){const e=h(t.placement);return e===D||
+// Create a bias to the `y` side axis due to horizontal
+// reading directions favoring greater width.
+"y"===e}return!0})).map((t=>[t.placement,t.overflows.filter((t=>t>0)).reduce(((t,e)=>t+e),0)])).sort(((t,e)=>t[1]-e[1]))[0])?void 0:M[0];t&&(n=t);break}case"initialPlacement":n=c}if(i!==n)return{reset:{placement:n}}}return{}}}},st=e=>({name:"arrow",options:e,async fn(n){const{x:o,y:i,placement:r,rects:l,platform:a,elements:u,middlewareData:h}=n,{element:p,padding:g=0}=s(e,n)||{};
+// Since `element` is required, we don't Partial<> the type.
+if(null==p)return{};const w=y(g),x={x:o,y:i},v=m(r),b=d(v),R=await a.getDimensions(p),T="y"===v,L=T?"top":"left",E=T?"bottom":"right",A=T?"clientHeight":"clientWidth",D=l.reference[b]+l.reference[v]-x[v]-l.floating[b],O=x[v]-l.reference[v],S=await(null==a.getOffsetParent?void 0:a.getOffsetParent(p));let C=S?S[A]:0;
+// DOM platform can return `window` as the `offsetParent`.
+C&&await(null==a.isElement?void 0:a.isElement(S))||(C=u.floating[A]||l.floating[b]);const P=D/2-O/2,F=C/2-R[b]/2-1,k=t(w[L],F),B=t(w[E],F),H=k,W=C-R[b]-B,V=C/2-R[b]/2+P,M=c(H,V,W),z=!h.arrow&&null!=f(r)&&V!==M&&l.reference[b]/2-(V<H?k:B)-R[b]/2<0,N=z?V<H?V-H:V-W:0;
+// If the padding is large enough that it causes the arrow to no longer be
+// centered, modify the padding so that it is centered.
+return{[v]:x[v]+N,data:{[v]:M,centerOffset:V-M-N,...z&&{alignmentOffset:N}},reset:z}}})
+/**
+ * Optimizes the visibility of the floating element by flipping the `placement`
+ * in order to keep it in view when the preferred placement(s) will overflow the
+ * clipping boundary. Alternative to `autoPlacement`.
+ * @see https://floating-ui.com/docs/flip
+ */,at=(t,e,n)=>{
+// This caches the expensive `getClippingElementAncestors` function so that
+// multiple lifecycle resets re-use the same result. It only lives for a
+// single call. If other functions become expensive, we can add them as well.
+const o=new Map,i={platform:et,...n},r={...i.platform,_c:o};return(async(t,e,n)=>{const{placement:o="bottom",strategy:i="absolute",middleware:r=[],platform:l}=n,c=r.filter(Boolean),s=await(null==l.isRTL?void 0:l.isRTL(e));let a=await l.getElementRects({reference:t,floating:e,strategy:i}),{x:f,y:u}=x(a,o,s),d=o,h={},m=0;for(let p=0;p<c.length;p++){const{name:n,fn:r}=c[p],{x:g,y:y,data:w,reset:v}=await r({x:f,y:u,initialPlacement:o,placement:d,strategy:i,middlewareData:h,rects:a,platform:l,elements:{reference:t,floating:e}});f=null!=g?g:f,u=null!=y?y:u,h={...h,[n]:{...h[n],...w}},v&&m<=50&&(m++,"object"==typeof v&&(v.placement&&(d=v.placement),v.rects&&(a=!0===v.rects?await l.getElementRects({reference:t,floating:e,strategy:i}):v.rects),({x:f,y:u}=x(a,d,s))),p=-1)}return{x:f,y:u,placement:d,strategy:i,middlewareData:h}})(t,e,{...i,platform:r})};
+/**
+ * Modifies the placement by translating the floating element along the
+ * specified axes.
+ * A number (shorthand for `mainAxis` or distance), or an axes configuration
+ * object may be passed.
+ * @see https://floating-ui.com/docs/offset
+ */export{st as a,ot as b,at as c,it as d,ct as f,rt as o,lt as s};
+//# sourceMappingURL=@floating-ui-f285e0b8.js.map

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/@popperjs-b696b006.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 14 - 0
plant2-demo/datav/assets/js/@turf-e5dd68ad.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 10 - 0
plant2-demo/datav/assets/js/@vue-37836d09.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/@vueuse-1ddca6f0.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
plant2-demo/datav/assets/js/async-validator-7d693152.js


+ 2 - 0
plant2-demo/datav/assets/js/d3-array-d83825ab.js

@@ -0,0 +1,2 @@
+function n(n,r){return n<r?-1:n>r?1:n>=r?0:NaN}var r,t;function e(n){for(var r,t,e,o=n.length,f=-1,u=0;++f<o;)u+=n[f].length;for(t=new Array(u);--o>=0;)for(r=(e=n[o]).length;--r>=0;)t[--u]=e[r];return t}1===(r=n).length&&(t=r,r=function(r,e){return n(t(r),e)});export{e as m};
+//# sourceMappingURL=d3-array-d83825ab.js.map

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 41 - 0
plant2-demo/datav/assets/js/d3-geo-106fc929.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/dayjs-423c4f07.js


+ 2 - 0
plant2-demo/datav/assets/js/deep-pick-omit-418f72d7.js

@@ -0,0 +1,2 @@
+function r(r,e){if(null==r)return;let t=r;for(let n=0;n<e.length;n++){if(null==t||null==t[e[n]])return;t=t[e[n]]}return t}function e(r,t,n){if(0===n.length)return t;const l=n[0];return n.length>1&&(t=e("object"==typeof r&&null!==r&&Object.prototype.hasOwnProperty.call(r,l)?r[l]:Number.isInteger(Number(n[1]))?[]:{},t,Array.prototype.slice.call(n,1))),Number.isInteger(Number(l))&&Array.isArray(r)?r.slice()[l]:Object.assign({},r,{[l]:t})}function t(r,n){if(null==r||0===n.length)return r;if(1===n.length){if(null==r)return r;if(Number.isInteger(n[0])&&Array.isArray(r))return Array.prototype.slice.call(r,0).splice(n[0],1);const e={};for(const t in r)e[t]=r[t];return delete e[n[0]],e}if(null==r[n[0]]){if(Number.isInteger(n[0])&&Array.isArray(r))return Array.prototype.concat.call([],r);const e={};for(const t in r)e[t]=r[t];return e}return e(r,t(r[n[0]],Array.prototype.slice.call(n,1)),[n[0]])}function n(t,n){return n.map((r=>r.split("."))).map((e=>[e,r(t,e)])).filter((r=>void 0!==r[1])).reduce(((r,t)=>e(r,t[1],t[0])),{})}function l(r,e){return e.map((r=>r.split("."))).reduce(((r,e)=>t(r,e)),r)}export{l as a,n as d};
+//# sourceMappingURL=deep-pick-omit-418f72d7.js.map

+ 2 - 0
plant2-demo/datav/assets/js/destr-9c6e2924.js

@@ -0,0 +1,2 @@
+const t=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,r=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,e=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function u(t,r){if(!("__proto__"===t||"constructor"===t&&r&&"object"==typeof r&&"prototype"in r))return r}function n(n,s={}){if("string"!=typeof n)return n;if('"'===n[0]&&'"'===n[n.length-1]&&-1===n.indexOf("\\"))return n.slice(1,-1);const i=n.trim();if(i.length<=9)switch(i.toLowerCase()){case"true":return!0;case"false":return!1;case"undefined":return;case"null":return null;case"nan":return Number.NaN;case"infinity":return Number.POSITIVE_INFINITY;case"-infinity":return Number.NEGATIVE_INFINITY}if(!e.test(n)){if(s.strict)throw new SyntaxError("[destr] Invalid JSON");return n}try{if(t.test(n)||r.test(n)){if(s.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(n,u)}return JSON.parse(n)}catch(o){if(s.strict)throw o;return n}}export{n as d};
+//# sourceMappingURL=destr-9c6e2924.js.map

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1081 - 0
plant2-demo/datav/assets/js/echarts-a77f8af6.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/element-plus-842069d4.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/index-6530d0f6.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 10286 - 0
plant2-demo/datav/assets/js/lodash-es-acda58df.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
plant2-demo/datav/assets/js/mapbox-gl-b315653c.js


+ 2 - 0
plant2-demo/datav/assets/js/memoize-one-63ab667a.js

@@ -0,0 +1,2 @@
+var t=Number.isNaN||function(t){return"number"==typeof t&&t!=t};function r(r,n){if(r.length!==n.length)return!1;for(var e=0;e<r.length;e++)if(l=r[e],u=n[e],!(l===u||t(l)&&t(u)))return!1;var l,u;return!0}function n(t,n){void 0===n&&(n=r);var e=null;function l(){for(var r=[],l=0;l<arguments.length;l++)r[l]=arguments[l];if(e&&e.lastThis===this&&n(r,e.lastArgs))return e.lastResult;var u=t.apply(this,r);return e={lastResult:u,lastArgs:r,lastThis:this},u}return l.clear=function(){e=null},l}export{n as m};
+//# sourceMappingURL=memoize-one-63ab667a.js.map

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/normalize-wheel-es-cf7d7ba7.js


+ 129 - 0
plant2-demo/datav/assets/js/nprogress-85851b89.js

@@ -0,0 +1,129 @@
+import{c as t,g as n}from"./@turf-e5dd68ad.js";var e={exports:{}};
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */e.exports=function(){var t,n,e={version:"0.2.0"},r=e.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};
+/**
+	   * Helpers
+	   */
+function i(t,n,e){return t<n?n:t>e?e:t}
+/**
+	   * (Internal) converts a percentage (`0..1`) to a bar translateX
+	   * percentage (`-100%..0%`).
+	   */function s(t){return 100*(-1+t)}
+/**
+	   * (Internal) returns the correct CSS for changing the bar's
+	   * position given an n percentage, and speed and ease from Settings
+	   */function o(t,n,e){var i;return(i="translate3d"===r.positionUsing?{transform:"translate3d("+s(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+s(t)+"%,0)"}:{"margin-left":s(t)+"%"}).transition="all "+n+"ms "+e,i}
+/**
+	   * (Internal) Queues a function to be executed.
+	   */
+/**
+	   * Updates configuration.
+	   *
+	   *     NProgress.configure({
+	   *       minimum: 0.1
+	   *     });
+	   */
+e.configure=function(t){var n,e;for(n in t)void 0!==(e=t[n])&&t.hasOwnProperty(n)&&(r[n]=e);return this},
+/**
+	   * Last number.
+	   */
+e.status=null,
+/**
+	   * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.
+	   *
+	   *     NProgress.set(0.4);
+	   *     NProgress.set(1.0);
+	   */
+e.set=function(t){var n=e.isStarted();t=i(t,r.minimum,1),e.status=1===t?null:t;var s=e.render(!n),c=s.querySelector(r.barSelector),l=r.speed,f=r.easing;return s.offsetWidth,/* Repaint */
+a((function(n){
+// Set positionUsing if it hasn't already been set
+""===r.positionUsing&&(r.positionUsing=e.getPositioningCSS()),
+// Add transition
+u(c,o(t,l,f)),1===t?(
+// Fade out
+u(s,{transition:"none",opacity:1}),s.offsetWidth,/* Repaint */
+setTimeout((function(){u(s,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){e.remove(),n()}),l)}),l)):setTimeout(n,l)})),this},e.isStarted=function(){return"number"==typeof e.status},
+/**
+	   * Shows the progress bar.
+	   * This is the same as setting the status to 0%, except that it doesn't go backwards.
+	   *
+	   *     NProgress.start();
+	   *
+	   */
+e.start=function(){e.status||e.set(0);var t=function(){setTimeout((function(){e.status&&(e.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},
+/**
+	   * Hides the progress bar.
+	   * This is the *sort of* the same as setting the status to 100%, with the
+	   * difference being `done()` makes some placebo effect of some realistic motion.
+	   *
+	   *     NProgress.done();
+	   *
+	   * If `true` is passed, it will show the progress bar even if its hidden.
+	   *
+	   *     NProgress.done(true);
+	   */
+e.done=function(t){return t||e.status?e.inc(.3+.5*Math.random()).set(1):this},
+/**
+	   * Increments by a random amount.
+	   */
+e.inc=function(t){var n=e.status;return n?("number"!=typeof t&&(t=(1-n)*i(Math.random()*n,.1,.95)),n=i(n+t,0,.994),e.set(n)):e.start()},e.trickle=function(){return e.inc(Math.random()*r.trickleRate)},
+/**
+	   * Waits for all supplied jQuery promises and
+	   * increases the progress as the promises resolve.
+	   *
+	   * @param $promise jQUery Promise
+	   */
+t=0,n=0,e.promise=function(r){return r&&"resolved"!==r.state()?(0===n&&e.start(),t++,n++,r.always((function(){0==--n?(t=0,e.done()):e.set((t-n)/t)})),this):this},
+/**
+	   * (Internal) renders the progress bar markup based on the `template`
+	   * setting.
+	   */
+e.render=function(t){if(e.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var n=document.createElement("div");n.id="nprogress",n.innerHTML=r.template;var i,o=n.querySelector(r.barSelector),a=t?"-100":s(e.status||0),c=document.querySelector(r.parent);return u(o,{transition:"all 0 linear",transform:"translate3d("+a+"%,0,0)"}),r.showSpinner||(i=n.querySelector(r.spinnerSelector))&&d(i),c!=document.body&&l(c,"nprogress-custom-parent"),c.appendChild(n),n},
+/**
+	   * Removes the element. Opposite of render().
+	   */
+e.remove=function(){f(document.documentElement,"nprogress-busy"),f(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&d(t)},
+/**
+	   * Checks if the progress bar is rendered.
+	   */
+e.isRendered=function(){return!!document.getElementById("nprogress")},
+/**
+	   * Determine which positioning CSS rule to use.
+	   */
+e.getPositioningCSS=function(){
+// Sniff on document.body.style
+var t=document.body.style,n="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";
+// Sniff prefixes
+return n+"Perspective"in t?"translate3d":n+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function n(){var e=t.shift();e&&e(n)}return function(e){t.push(e),1==t.length&&n()}}(),u=function(){var t=["Webkit","O","Moz","ms"],n={};function e(t){return t.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,n){return n.toUpperCase()}))}function r(n){var e=document.body.style;if(n in e)return n;for(var r,i=t.length,s=n.charAt(0).toUpperCase()+n.slice(1);i--;)if((r=t[i]+s)in e)return r;return n}function i(t){return t=e(t),n[t]||(n[t]=r(t))}function s(t,n,e){n=i(n),t.style[n]=e}return function(t,n){var e,r,i=arguments;if(2==i.length)for(e in n)void 0!==(r=n[e])&&n.hasOwnProperty(e)&&s(t,e,r);else s(t,i[1],i[2])}}();
+/**
+	   * (Internal) Applies css properties to an element, similar to the jQuery 
+	   * css method.
+	   *
+	   * While this helper does assist with vendor prefixed property names, it 
+	   * does not perform any manipulation of values prior to setting styles.
+	   */
+/**
+	   * (Internal) Determines if an element or space separated list of class names contains a class name.
+	   */
+function c(t,n){return("string"==typeof t?t:m(t)).indexOf(" "+n+" ")>=0}
+/**
+	   * (Internal) Adds a class to an element.
+	   */function l(t,n){var e=m(t),r=e+n;c(e,n)||(
+// Trim the opening space.
+t.className=r.substring(1))}
+/**
+	   * (Internal) Removes a class from an element.
+	   */function f(t,n){var e,r=m(t);c(t,n)&&(
+// Replace the class name.
+e=r.replace(" "+n+" "," "),
+// Trim the opening and closing spaces.
+t.className=e.substring(1,e.length-1))}
+/**
+	   * (Internal) Gets a space separated list of the class names on the element. 
+	   * The list is wrapped with a single space on each end to facilitate finding 
+	   * matches within the list.
+	   */function m(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}
+/**
+	   * (Internal) Removes an element from the DOM.
+	   */function d(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return e}();const r=n(e.exports);export{r as N};
+//# sourceMappingURL=nprogress-85851b89.js.map

+ 175 - 0
plant2-demo/datav/assets/js/pinia-0c8641d4.js

@@ -0,0 +1,175 @@
+import{i as t}from"./vue-demi-71ba0ef2.js";import{ao as e,h as n,an as s,p as o,i as a,X as c,x as r,aw as i,ab as u,ax as f,g as p,f as l,n as h,ad as d,m as y}from"./@vue-37836d09.js";
+/*!
+ * pinia v2.3.1
+ * (c) 2025 Eduardo San Martin Morote
+ * @license MIT
+ */
+/**
+ * setActivePinia must be called to handle SSR at the top of functions like
+ * `fetch`, `setup`, `serverPrefetch` and others
+ */let b;
+/**
+ * Sets or unsets the active pinia. Used in SSR and internally when calling
+ * actions and getters
+ *
+ * @param pinia - Pinia instance
+ */
+// @ts-expect-error: cannot constrain the type of the return
+const v=t=>b=t,_=/* istanbul ignore next */Symbol();function m(
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+t){return t&&"object"==typeof t&&"[object Object]"===Object.prototype.toString.call(t)&&"function"!=typeof t.toJSON}
+// type DeepReadonly<T> = { readonly [P in keyof T]: DeepReadonly<T[P]> }
+// TODO: can we change these to numbers?
+/**
+ * Possible types for SubscriptionCallback
+ */var j;
+/**
+ * Creates a Pinia instance to be used by the application
+ */
+function O(){const o=e(!0),a=o.run((()=>n({})));
+// NOTE: here we could check the window object for a state and directly set it
+// if there is anything like it with Vue 3 SSR
+let c=[],r=[];
+// plugins added before calling app.use(pinia)
+const i=s({install(t){
+// this allows calling useStore() outside of a component setup after
+// installing pinia's plugin
+v(i),i._a=t,t.provide(_,i),t.config.globalProperties.$pinia=i,r.forEach((t=>c.push(t))),r=[]},use(e){return this._a||t?c.push(e):r.push(e),this},_p:c,
+// it's actually undefined here
+// @ts-expect-error
+_a:null,_e:o,_s:new Map,state:a});return i}!function(t){
+/**
+     * Direct mutation of the state:
+     *
+     * - `store.name = 'new name'`
+     * - `store.$state.name = 'new name'`
+     * - `store.list.push('new item')`
+     */
+t.direct="direct",
+/**
+     * Mutated the state with `$patch` and an object
+     *
+     * - `store.$patch({ name: 'newName' })`
+     */
+t.patchObject="patch object",
+/**
+     * Mutated the state with `$patch` and a function
+     *
+     * - `store.$patch(state => state.name = 'newName')`
+     */
+t.patchFunction="patch function"}(j||(j={}));const $=()=>{};function g(t,e,n,s=$){t.push(e);const o=()=>{const n=t.indexOf(e);n>-1&&(t.splice(n,1),s())};return!n&&p()&&l(o),o}function S(t,...e){t.slice().forEach((t=>{t(...e)}))}const P=t=>t()
+/**
+ * Marks a function as an action for `$onAction`
+ * @internal
+ */,w=Symbol(),E=Symbol();function x(t,e){
+// Handle Map instances
+t instanceof Map&&e instanceof Map?e.forEach(((e,n)=>t.set(n,e))):t instanceof Set&&e instanceof Set&&
+// Handle Set instances
+e.forEach(t.add,t);
+// no need to go through symbols because they cannot be serialized anyway
+for(const n in e){if(!e.hasOwnProperty(n))continue;const s=e[n],o=t[n];m(o)&&m(s)&&t.hasOwnProperty(n)&&!r(s)&&!i(s)?
+// NOTE: here I wanted to warn about inconsistent types but it's not possible because in setup stores one might
+// start the value of a property as a certain type e.g. a Map, and then for some reason, during SSR, change that
+// to `undefined`. When trying to hydrate, we want to override the Map with `undefined`.
+t[n]=x(o,s):
+// @ts-expect-error: subPatch is a valid value
+t[n]=s}return t}const I=/* istanbul ignore next */Symbol();
+/**
+ * Returns whether a value should be hydrated
+ *
+ * @param obj - target variable
+ * @returns true if `obj` should be hydrated
+ */const{assign:M}=Object;function A(t,s,o={},f,p,l){let d;const y=M({actions:{}},o),b={deep:!0};
+// watcher options for $subscribe
+// internal state
+let _,O,A,F=[],k=[];// set to true at the end
+const z=f.state.value[t];
+// avoid setting the state for option stores if it is set
+// by the setup
+// avoid triggering too many listeners
+// https://github.com/vuejs/pinia/issues/1129
+let C;function J(e){let n;_=O=!1,"function"==typeof e?(e(f.state.value[t]),n={type:j.patchFunction,storeId:t,events:A}):(x(f.state.value[t],e),n={type:j.patchObject,payload:e,storeId:t,events:A});const s=C=Symbol();h().then((()=>{C===s&&(_=!0)})),O=!0,
+// because we paused the watcher, we need to manually call the subscriptions
+S(F,n,f.state.value[t])}l||z||(f.state.value[t]={}),n({});const N=l?function(){const{state:t}=o,e=t?t():{};
+// we use a patch to group all changes into one single subscription
+this.$patch((t=>{
+// @ts-expect-error: FIXME: shouldn't error?
+M(t,e)}))}:/* istanbul ignore next */
+$;
+/**
+     * Helper that wraps function so it can be tracked with $onAction
+     * @param fn - action to wrap
+     * @param name - name of the action
+     */
+const W=(e,n="")=>{if(w in e)return e[E]=n,e;const s=function(){v(f);const n=Array.from(arguments),o=[],a=[];let c;
+// @ts-expect-error
+S(k,{args:n,name:s[E],store:q,after:function(t){o.push(t)},onError:function(t){a.push(t)}});try{c=e.apply(this&&this.$id===t?this:q,n);
+// handle sync errors
+}catch(r){throw S(a,r),r}return c instanceof Promise?c.then((t=>(S(o,t),t))).catch((t=>(S(a,t),Promise.reject(t)))):(
+// trigger after callbacks
+S(o,c),c)};// will be set later
+// @ts-expect-error: we are intentionally limiting the returned type to just Fn
+// because all the added properties are internals that are exposed through `$onAction()` only
+return s[w]=!0,s[E]=n,s},X={_p:f,
+// _s: scope,
+$id:t,$onAction:g.bind(null,k),$patch:J,$reset:N,$subscribe(e,n={}){const s=g(F,e,n.detached,(()=>o())),o=d.run((()=>a((()=>f.state.value[t]),(s=>{("sync"===n.flush?O:_)&&e({storeId:t,type:j.direct,events:A},s)}),M({},b,n))));return s},$dispose:function(){d.stop(),F=[],k=[],f._s.delete(t)}},q=c(X);
+// store the partial store now so the setup of stores can instantiate each other before they are finished without
+// creating infinite loops.
+f._s.set(t,q);const B=(f._a&&f._a.runWithContext||P)((()=>f._e.run((()=>(d=e()).run((()=>s({action:W})))))));
+// TODO: idea create skipSerialize that marks properties as non serializable and they are skipped
+// overwrite existing actions to support $onAction
+for(const e in B){const n=B[e];if(r(n)&&(!r(G=n)||!G.effect)||i(n))
+// mark it as a piece of state to be serialized
+l||(
+// in setup stores we must hydrate the state and sync pinia state tree with the refs the user just created
+!z||m(D=n)&&D.hasOwnProperty(I)||(r(n)?n.value=z[e]:
+// probably a reactive object, lets recursively assign
+// @ts-expect-error: prop is unknown
+x(n,z[e])),f.state.value[t][e]=n);
+// action
+else if("function"==typeof n){const t=W(n,e);
+// this a hot module replacement store because the hotUpdate method needs
+// to do it with the right context
+/* istanbul ignore if */
+// @ts-expect-error
+B[e]=t,
+// list actions so they can be used in plugins
+// @ts-expect-error
+y.actions[e]=n}}
+// add the state, getters, and action properties
+/* istanbul ignore if */var D,G;return M(q,B),
+// allows retrieving reactive objects with `storeToRefs()`. Must be called after assigning to the reactive object.
+// Make `storeToRefs()` work with `reactive()` #799
+M(u(q),B),
+// use this instead of a computed with setter to be able to create it anywhere
+// without linking the computed lifespan to wherever the store is first
+// created.
+Object.defineProperty(q,"$state",{get:()=>f.state.value[t],set:t=>{J((e=>{
+// @ts-expect-error: FIXME: shouldn't error?
+M(e,t)}))}}),
+// apply all plugins
+f._p.forEach((t=>{M(q,d.run((()=>t({store:q,app:f._a,pinia:f,options:y}))))})),
+// only apply hydrate to option stores with an initial state in pinia
+z&&l&&o.hydrate&&o.hydrate(q.$state,z),_=!0,O=!0,q}
+// allows unused stores to be tree shaken
+/*! #__NO_SIDE_EFFECTS__ */function F(
+// TODO: add proper types from above
+t,e,n){let a,c;const r="function"==typeof e;function i(t,n){const i=f();(t=
+// in test mode, ignore the argument provided as we can always retrieve a
+// pinia instance with getActivePinia()
+t||(i?o(_,null):null))&&v(t),(t=b)._s.has(a)||(
+// creating the store registers it in `pinia._s`
+r?A(a,e,c,t):function(t,e,n){const{state:o,actions:a,getters:c}=e,r=n.state.value[t];let i;i=A(t,(function(){r||(n.state.value[t]=o?o():{});
+// avoid creating a state in pinia.state.value
+const e=d(n.state.value[t]);return M(e,a,Object.keys(c||{}).reduce(((e,o)=>(e[o]=s(y((()=>{v(n);
+// it was created just before
+const e=n._s.get(t);
+// @ts-expect-error
+// return getters![name].call(context, context)
+// TODO: avoid reading the getter while assigning with a global variable
+return c[o].call(e,e)}))),e)),{}))}),e,n,0,!0)}(a,c,t));
+// StoreGeneric cannot be casted towards Store
+return t._s.get(a)}return"string"==typeof t?(a=t,
+// the option store setup will contain the actual options in this case
+c=r?n:e):(c=t,a=t.id),i.$id=a,i}export{O as c,F as d};
+//# sourceMappingURL=pinia-0c8641d4.js.map

+ 6 - 0
plant2-demo/datav/assets/js/pinia-plugin-persistedstate-1ec13968.js

@@ -0,0 +1,6 @@
+import{d as e}from"./destr-9c6e2924.js";import{d as r,a as t}from"./deep-pick-omit-418f72d7.js";
+// src/index.ts
+function i(e,{storage:i,serializer:a,key:s,debug:o,pick:c,omit:n,beforeHydrate:d,afterHydrate:f},y,p=!0){try{p&&d?.(y);const o=i.getItem(s);if(o){const i=a.deserialize(o),s=c?r(i,c):i,d=n?t(s,n):s;e.$patch(d)}p&&f?.(y)}catch(u){}}function a(e,{storage:i,serializer:a,key:s,debug:o,pick:c,omit:n}){try{const o=c?r(e,c):e,d=n?t(o,n):o,f=a.serialize(d);i.setItem(s,f)}catch(d){}}var s=
+// src/index.ts
+function(r={}){return function(t){!function(e,r,t){const{pinia:s,store:o,options:{persist:c=t}}=e;if(!c)return;if(!(o.$id in s.state.value)){const e=s._s.get(o.$id.replace("__hot:",""));return void(e&&Promise.resolve().then((()=>e.$persist())))}const n=(Array.isArray(c)?c:!0===c?[{}]:[c]).map(r);o.$hydrate=({runHooks:r=!0}={})=>{n.forEach((t=>{i(o,t,e,r)}))},o.$persist=()=>{n.forEach((e=>{a(o.$state,e)}))},n.forEach((r=>{i(o,r,e),o.$subscribe(((e,t)=>a(t,r)),{detached:!0})}))}(t,(i=>({key:(r.key?r.key:e=>e)(i.key??t.store.$id),debug:i.debug??r.debug??!1,serializer:i.serializer??r.serializer??{serialize:e=>JSON.stringify(e),deserialize:r=>e(r)},storage:i.storage??r.storage??window.localStorage,beforeHydrate:i.beforeHydrate,afterHydrate:i.afterHydrate,pick:i.pick,omit:i.omit})),r.auto??!1)}}();export{s};
+//# sourceMappingURL=pinia-plugin-persistedstate-1ec13968.js.map

+ 2 - 0
plant2-demo/datav/assets/js/vue-demi-71ba0ef2.js

@@ -0,0 +1,2 @@
+var a=!1;export{a as i};
+//# sourceMappingURL=vue-demi-71ba0ef2.js.map

+ 18 - 0
plant2-demo/datav/assets/js/vue-next-wxlogin-91e03b70.js

@@ -0,0 +1,18 @@
+import{m as e,o as t,c as r}from"./@vue-37836d09.js";const s=(e,t)=>{const r=e.__vccOpts||e;for(const[s,i]of t)r[s]=i;return r},i=["src"];const n=s({props:{
+//应用唯一标识,在微信开放平台提交应用审核通过后获得
+appid:String,
+//应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
+scope:String,
+//重定向地址,需要进行UrlEncode
+redirect_uri:String,
+//用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
+state:{type:String,default:""},
+//提供"black"、"white"可选,默认为黑色文字描述。详见文档底部FAQ
+theme:{type:String,default:"black"},
+// 自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ
+href:{type:String,default:""},
+// true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。
+self_redirect:{type:String,default:"default"},
+// sdk的扩展字符串,但是在这里就默认了jssdk,暂时不建议修改
+login_type:{type:String,default:"jssdk"}},setup:t=>({setSrc:e((()=>"https://open.weixin.qq.com/connect/qrconnect?appid="+t.appid+"&scope="+t.scope+"&redirect_uri="+t.redirect_uri+"&state="+t.state+"&login_type="+t.login_type+"&style="+t.theme+"&self_redirect="+t.self_redirect+"&href="+t.href))})},[["render",function(e,s,n,o,c,a){return t(),r("iframe",{sandbox:"allow-scripts allow-top-navigation allow-same-origin",scrolling:"no",width:"300",height:"400",frameBorder:"0",allowTransparency:"true",src:o.setSrc},null,8,i)}],["__scopeId","data-v-750eccfd"]]);export{s as _,n as w};
+//# sourceMappingURL=vue-next-wxlogin-91e03b70.js.map

+ 928 - 0
plant2-demo/datav/assets/js/vue-router-c7cbbcaa.js

@@ -0,0 +1,928 @@
+import{s as e,u as t,av as n,n as r,p as o,d as a,X as s,m as c,af as l,B as i,h as u,i as f}from"./@vue-37836d09.js";
+/*!
+  * vue-router v4.5.0
+  * (c) 2024 Eduardo San Martin Morote
+  * @license MIT
+  */const p="undefined"!=typeof document;
+/**
+ * Allows differentiating lazy components from functional components and vue-class-component
+ * @internal
+ *
+ * @param component
+ */function h(e){return"object"==typeof e||"displayName"in e||"props"in e||"__vccOpts"in e}const d=Object.assign;function m(e,t){const n={};for(const r in t){const o=t[r];n[r]=v(o)?o.map(e):e(o)}return n}const g=()=>{},v=Array.isArray,y=/#/g,b=/&/g,w=/\//g,E=/=/g,R=/\?/g,k=/\+/g,O=/%5B/g,x=/%5D/g,P=/%5E/g,C=/%60/g,j=/%7B/g,$=/%7C/g,S=/%7D/g,A=/%20/g;
+/**
+ * Typesafe alternative to Array.isArray
+ * https://github.com/microsoft/TypeScript/pull/48228
+ */ // }
+/**
+ * Encode characters that need to be encoded on the path, search and hash
+ * sections of the URL.
+ *
+ * @internal
+ * @param text - string to encode
+ * @returns encoded string
+ */
+function q(e){return encodeURI(""+e).replace($,"|").replace(O,"[").replace(x,"]")}
+/**
+ * Encode characters that need to be encoded on the hash section of the URL.
+ *
+ * @param text - string to encode
+ * @returns encoded string
+ */
+/**
+ * Encode characters that need to be encoded query values on the query
+ * section of the URL.
+ *
+ * @param text - string to encode
+ * @returns encoded string
+ */
+function L(e){return q(e).replace(k,"%2B").replace(A,"+").replace(y,"%23").replace(b,"%26").replace(C,"`").replace(j,"{").replace(S,"}").replace(P,"^")}
+/**
+ * Like `encodeQueryValue` but also encodes the `=` character.
+ *
+ * @param text - string to encode
+ */
+/**
+ * Encode characters that need to be encoded on the path section of the URL as a
+ * param. This function encodes everything {@link encodePath} does plus the
+ * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty
+ * string instead.
+ *
+ * @param text - string to encode
+ * @returns encoded string
+ */
+function M(e){return null==e?"":
+/**
+ * Encode characters that need to be encoded on the path section of the URL.
+ *
+ * @param text - string to encode
+ * @returns encoded string
+ */
+function(e){return q(e).replace(y,"%23").replace(R,"%3F")}(e).replace(w,"%2F")}
+/**
+ * Decode text using `decodeURIComponent`. Returns the original text if it
+ * fails.
+ *
+ * @param text - string to decode
+ * @returns decoded string
+ */function B(e){try{return decodeURIComponent(""+e)}catch(t){}return""+e}const G=/\/$/;
+/**
+ * Transforms a URI into a normalized history location
+ *
+ * @param parseQuery
+ * @param location - URI to normalize
+ * @param currentLocation - current absolute location. Allows resolving relative
+ * paths. Must start with `/`. Defaults to `/`
+ * @returns a normalized history location
+ */
+function _(e,t,n="/"){let r,o={},a="",s="";
+// Could use URL and URLSearchParams but IE 11 doesn't support it
+// TODO: move to new URL()
+const c=t.indexOf("#");let l=t.indexOf("?");
+// the hash appears before the search, so it's not part of the search string
+// empty path means a relative query or hash `?foo=f`, `#thing`
+return c<l&&c>=0&&(l=-1),l>-1&&(r=t.slice(0,l),a=t.slice(l+1,c>-1?c:t.length),o=e(a)),c>-1&&(r=r||t.slice(0,c),
+// keep the # character
+s=t.slice(c,t.length)),
+// no search and no query
+r=
+/**
+ * Resolves a relative path that starts with `.`.
+ *
+ * @param to - path location we are resolving
+ * @param from - currentLocation.path, should start with `/`
+ */
+function(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];
+// make . and ./ the same (../ === .., ../../ === ../..)
+// this is the same behavior as new URL()
+".."!==o&&"."!==o||r.push("");let a,s,c=n.length-1;for(a=0;a<r.length;a++)
+// we stay on the same position
+if(s=r[a],"."!==s){
+// go up in the from array
+if(".."!==s)break;
+// we can't go below zero, but we still need to increment toPosition
+c>1&&c--;
+// continue
+}return n.slice(0,c).join("/")+"/"+r.slice(a).join("/")}
+/**
+ * Initial route location where the router is. Can be used in navigation guards
+ * to differentiate the initial navigation.
+ *
+ * @example
+ * ```js
+ * import { START_LOCATION } from 'vue-router'
+ *
+ * router.beforeEach((to, from) => {
+ *   if (from === START_LOCATION) {
+ *     // initial navigation
+ *   }
+ * })
+ * ```
+ */(null!=r?r:t,n),{fullPath:r+(a&&"?")+a+s,path:r,query:o,hash:B(s)}}
+/**
+ * Stringifies a URL object
+ *
+ * @param stringifyQuery
+ * @param location
+ */
+/**
+ * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.
+ *
+ * @param pathname - location.pathname
+ * @param base - base to strip off
+ */
+function I(e,t){
+// no base or base is not found at the beginning
+return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}
+/**
+ * Checks if two RouteLocation are equal. This means that both locations are
+ * pointing towards the same {@link RouteRecord} and that all `params`, `query`
+ * parameters and `hash` are the same
+ *
+ * @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.
+ * @param a - first {@link RouteLocation}
+ * @param b - second {@link RouteLocation}
+ */
+/**
+ * Check if two `RouteRecords` are equal. Takes into account aliases: they are
+ * considered equal to the `RouteRecord` they are aliasing.
+ *
+ * @param a - first {@link RouteRecord}
+ * @param b - second {@link RouteRecord}
+ */
+function T(e,t){
+// since the original record has an undefined value for aliasOf
+// but all aliases point to the original record, this will always compare
+// the original record
+return(e.aliasOf||e)===(t.aliasOf||t)}function W(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!D(e[n],t[n]))return!1;return!0}function D(e,t){return v(e)?U(e,t):v(t)?U(t,e):e===t}
+/**
+ * Check if two arrays are the same or if an array with one single entry is the
+ * same as another primitive value. Used to check query and parameters
+ *
+ * @param a - array of values
+ * @param b - array of values or a single value
+ */function U(e,t){return v(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}const V={path:"/",
+// TODO: could we use a symbol in the future?
+name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var F,z;
+// Generic utils
+/**
+ * Normalizes a base by removing any trailing slash and reading the base tag if
+ * present.
+ *
+ * @param base - base to normalize
+ */
+function K(e){if(!e)if(p){
+// respect <base> tag
+const t=document.querySelector("base");
+// strip full URL origin
+e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";
+// ensure leading slash when it was removed by the regex above avoid leading
+// slash with hash because the file could be read from the disk like file://
+// and the leading slash would cause problems
+// remove the trailing slash so all other method can just do `base + fullPath`
+// to build an href
+return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),e.replace(G,"")}
+// remove any character before the hash
+!function(e){e.pop="pop",e.push="push"}(F||(F={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(z||(z={}));const H=/^[^#]+#/;function X(e,t){return e.replace(H,"#")+t}const Q=()=>({left:window.scrollX,top:window.scrollY});function Y(e){let t;if("el"in e){const n=e.el,r="string"==typeof n&&n.startsWith("#"),o="string"==typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}function N(e,t){return(history.state?history.state.position-t:-1)+e}const Z=new Map;
+// TODO: RFC about how to save scroll position
+/**
+ * ScrollBehavior instance used by the router to compute and restore the scroll
+ * position when navigating.
+ */
+// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {
+//   // returns a scroll position that can be saved in history
+//   compute(): ScrollPositionEntry
+//   // can take an extended ScrollPositionEntry
+//   scroll(position: ScrollPosition): void
+// }
+// export const scrollHandler: ScrollHandler<ScrollPosition> = {
+//   compute: computeScroll,
+//   scroll: scrollToPosition,
+// }
+let J=()=>location.protocol+"//"+location.host
+/**
+ * Creates a normalized history location from a window.location object
+ * @param base - The base path
+ * @param location - The window.location object
+ */;function ee(e,t){const{pathname:n,search:r,hash:o}=t,a=e.indexOf("#");
+// allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end
+if(a>-1){let t=o.includes(e.slice(a))?e.slice(a).length:1,n=o.slice(t);
+// prepend the starting slash to hash so the url starts with /#
+return"/"!==n[0]&&(n="/"+n),I(n,"")}return I(n,e)+r+o}
+/**
+ * Creates a state object
+ */
+function te(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Q():null}}
+/**
+ * Creates an HTML5 history. Most common history for single page applications.
+ *
+ * @param base -
+ */
+function ne(e){const t=function(e){const{history:t,location:n}=window,r={value:ee(e,n)},o={value:t.state};
+// private variables
+function a(r,a,s){
+/**
+         * if a base tag is provided, and we are on a normal domain, we have to
+         * respect the provided `base` attribute because pushState() will use it and
+         * potentially erase anything before the `#` like at
+         * https://github.com/vuejs/router/issues/685 where a base of
+         * `/folder/#` but a base of `/` would erase the `/folder/` section. If
+         * there is no host, the `<base>` tag makes no sense and if there isn't a
+         * base tag we can just use everything after the `#`.
+         */
+const c=e.indexOf("#"),l=c>-1?(n.host&&document.querySelector("base")?e:e.slice(c))+r:J()+e+r;try{
+// BROWSER QUIRK
+// NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds
+t[s?"replaceState":"pushState"](a,"",l),o.value=a}catch(i){
+// Force the navigation, this also resets the call count
+n[s?"replace":"assign"](l)}}
+// build current history entry as this is a fresh navigation
+return o.value||a(r.value,{back:null,current:r.value,forward:null,
+// the length is off by one, we need to decrease it
+position:t.length-1,replaced:!0,
+// don't add a scroll as the user may have an anchor, and we want
+// scrollBehavior to be triggered without a saved position
+scroll:null},!0),{location:r,state:o,push:function(e,n){
+// Add to current entry the information of where we are going
+// as well as saving the current position
+const s=d({},
+// use current history state to gracefully handle a wrong call to
+// history.replaceState
+// https://github.com/vuejs/router/issues/366
+o.value,t.state,{forward:e,scroll:Q()});a(s.current,s,!0),a(e,d({},te(r.value,e,null),{position:s.position+1},n),!1),r.value=e},replace:function(e,n){a(e,d({},t.state,te(o.value.back,
+// keep back and forward entries but override current position
+e,o.value.forward,!0),n,{position:o.value.position}),!0),r.value=e}}}(e=K(e)),n=function(e,t,n,r){let o=[],a=[],s=null;const c=({state:a})=>{const c=ee(e,location),l=n.value,i=t.value;let u=0;if(a){
+// ignore the popstate and reset the pauseState
+if(n.value=c,t.value=a,s&&s===l)return void(s=null);u=i?a.position-i.position:0}else r(c);
+// Here we could also revert the navigation by calling history.go(-delta)
+// this listener will have to be adapted to not trigger again and to wait for the url
+// to be updated before triggering the listeners. Some kind of validation function would also
+// need to be passed to the listeners so the navigation can be accepted
+// call all listeners
+o.forEach((e=>{e(n.value,l,{delta:u,type:F.pop,direction:u?u>0?z.forward:z.back:z.unknown})}))};function l(){const{history:e}=window;e.state&&e.replaceState(d({},e.state,{scroll:Q()}),"")}
+// set up the listeners and prepare teardown callbacks
+return window.addEventListener("popstate",c),
+// TODO: could we use 'pagehide' or 'visibilitychange' instead?
+// https://developer.chrome.com/blog/page-lifecycle-api/
+window.addEventListener("beforeunload",l,{passive:!0}),{pauseListeners:function(){s=n.value},listen:function(e){
+// set up the listener and prepare teardown callbacks
+o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return a.push(t),t},destroy:function(){for(const e of a)e();a=[],window.removeEventListener("popstate",c),window.removeEventListener("beforeunload",l)}}}(e,t.state,t.location,t.replace);const r=d({
+// it's overridden right after
+location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:X.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function re(e){return"string"==typeof e||"symbol"==typeof e}const oe=Symbol("");
+/**
+ * Enumeration with all possible types for navigation failures. Can be passed to
+ * {@link isNavigationFailure} to check for specific failures.
+ */var ae;
+/**
+ * Creates a typed NavigationFailure object.
+ * @internal
+ * @param type - NavigationFailureType
+ * @param params - { from, to }
+ */
+function se(e,t){return d(new Error,{type:e,[oe]:!0},t)}function ce(e,t){return e instanceof Error&&oe in e&&(null==t||!!(e.type&t))}
+// default pattern for a param: non-greedy everything but /
+!function(e){
+/**
+     * An aborted navigation is a navigation that failed because a navigation
+     * guard returned `false` or called `next(false)`
+     */
+e[e.aborted=4]="aborted",
+/**
+     * A cancelled navigation is a navigation that failed because a more recent
+     * navigation finished started (not necessarily finished).
+     */
+e[e.cancelled=8]="cancelled",
+/**
+     * A duplicated navigation is a navigation that failed because it was
+     * initiated while already being at the exact same location.
+     */
+e[e.duplicated=16]="duplicated"}(ae||(ae={}));const le="[^/]+?",ie={sensitive:!1,strict:!1,start:!0,end:!0},ue=/[.+*?^${}()[\]/\\]/g;
+/**
+ * Compares an array of numbers as used in PathParser.score and returns a
+ * number. This function can be used to `sort` an array
+ *
+ * @param a - first array of numbers
+ * @param b - second array of numbers
+ * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b
+ * should be sorted first
+ */
+function fe(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];
+// only keep going if diff === 0
+if(r)return r;n++}
+// if the last subsegment was Static, the shorter segments should be sorted first
+// otherwise sort the longest segment first
+return e.length<t.length?1===e.length&&80/* PathScore.Segment */===e[0]?-1:1:e.length>t.length?1===t.length&&80/* PathScore.Segment */===t[0]?1:-1:0}
+/**
+ * Compare function that can be used with `sort` to sort an array of PathParser
+ *
+ * @param a - first PathParser
+ * @param b - second PathParser
+ * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b
+ */function pe(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const e=fe(r[n],o[n]);
+// do not return if both are equal
+if(e)return e;n++}if(1===Math.abs(o.length-r.length)){if(he(r))return 1;if(he(o))return-1}
+// if a and b share the same score entries but b has more, sort b first
+return o.length-r.length;
+// this is the ternary version
+// return aScore.length < bScore.length
+//   ? 1
+//   : aScore.length > bScore.length
+//   ? -1
+//   : 0
+}
+/**
+ * This allows detecting splats at the end of a path: /home/:id(.*)*
+ *
+ * @param score - score to check
+ * @returns true if the last entry is negative
+ */function he(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const de={type:0/* TokenType.Static */,value:""},me=/[a-zA-Z0-9_]/;function ge(e,t,n){const r=
+/**
+ * Creates a path parser from an array of Segments (a segment is an array of Tokens)
+ *
+ * @param segments - array of segments returned by tokenizePath
+ * @param extraOptions - optional options for the regexp
+ * @returns a PathParser
+ */
+function(e,t){const n=d({},ie,t),r=[];
+// the amount of scores is the same as the length of segments except for the root segment "/"
+// the regexp as a string
+let o=n.start?"^":"";
+// extracted keys
+const a=[];for(const l of e){
+// the root segment needs special treatment
+const e=l.length?[]:[90/* PathScore.Root */];
+// allow trailing slash
+n.strict&&!l.length&&(o+="/");for(let t=0;t<l.length;t++){const r=l[t];
+// resets the score if we are inside a sub-segment /:a-other-:b
+let s=40/* PathScore.Segment */+(n.sensitive?.25/* PathScore.BonusCaseSensitive */:0);if(0/* TokenType.Static */===r.type)
+// prepend the slash if we are starting a new segment
+t||(o+="/"),o+=r.value.replace(ue,"\\$&"),s+=40/* PathScore.Static */;else if(1/* TokenType.Param */===r.type){const{value:e,repeatable:n,optional:i,regexp:u}=r;a.push({name:e,repeatable:n,optional:i});const f=u||le;
+// the user provided a custom regexp /:id(\\d+)
+if(f!==le){s+=10/* PathScore.BonusCustomRegExp */;
+// make sure the regexp is valid before using it
+try{new RegExp(`(${f})`)}catch(c){throw new Error(`Invalid custom RegExp for param "${e}" (${f}): `+c.message)}}
+// when we repeat we must take care of the repeating leading slash
+let p=n?`((?:${f})(?:/(?:${f}))*)`:`(${f})`;
+// prepend the slash if we are starting a new segment
+t||(p=
+// avoid an optional / if there are more segments e.g. /:p?-static
+// or /:p?-:p2
+i&&l.length<2?`(?:/${p})`:"/"+p),i&&(p+="?"),o+=p,s+=20/* PathScore.Dynamic */,i&&(s+=-8/* PathScore.BonusOptional */),n&&(s+=-20/* PathScore.BonusRepeatable */),".*"===f&&(s+=-50/* PathScore.BonusWildcard */)}e.push(s)}
+// an empty array like /home/ -> [[{home}], []]
+// if (!segment.length) pattern += '/'
+r.push(e)}
+// only apply the strict bonus to the last score
+if(n.strict&&n.end){const e=r.length-1;r[e][r[e].length-1]+=.7000000000000001/* PathScore.BonusStrict */}
+// TODO: dev only warn double trailing slash
+n.strict||(o+="/?"),n.end?o+="$":n.strict&&!o.endsWith("/")&&(o+="(?:/|$)");const s=new RegExp(o,n.sensitive?"":"i");return{re:s,score:r,keys:a,parse:function(e){const t=e.match(s),n={};if(!t)return null;for(let r=1;r<t.length;r++){const e=t[r]||"",o=a[r-1];n[o.name]=e&&o.repeatable?e.split("/"):e}return n},stringify:function(t){let n="",r=!1;
+// for optional parameters to allow to be empty
+for(const o of e){r&&n.endsWith("/")||(n+="/"),r=!1;for(const e of o)if(0/* TokenType.Static */===e.type)n+=e.value;else if(1/* TokenType.Param */===e.type){const{value:a,repeatable:s,optional:c}=e,l=a in t?t[a]:"";if(v(l)&&!s)throw new Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);const i=v(l)?l.join("/"):l;if(!i){if(!c)throw new Error(`Missing required param "${a}"`);
+// if we have more than one optional param like /:a?-static we don't need to care about the optional param
+o.length<2&&(
+// remove the last slash as we could be at the end
+n.endsWith("/")?n=n.slice(0,-1):r=!0)}n+=i}}
+// avoid empty path when we have multiple optional params
+return n||"/"}}}(
+// After some profiling, the cache seems to be unnecessary because tokenizePath
+// (the slowest part of adding a route) is very fast
+// const tokenCache = new Map<string, Token[][]>()
+function(e){if(!e)return[[]];if("/"===e)return[[de]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);
+// if (tokenCache.has(path)) return tokenCache.get(path)!
+function t(e){throw new Error(`ERR (${n})/"${i}": ${e}`)}let n=0/* TokenizerState.Static */,r=n;const o=[];
+// the segment will always be valid because we get into the initial state
+// with the leading /
+let a;function s(){a&&o.push(a),a=[]}
+// index on the path
+let c,l=0,i="",u="";
+// char at index
+function f(){i&&(0/* TokenizerState.Static */===n?a.push({type:0/* TokenType.Static */,value:i}):1/* TokenizerState.Param */===n||2/* TokenizerState.ParamRegExp */===n||3/* TokenizerState.ParamRegExpEnd */===n?(a.length>1&&("*"===c||"+"===c)&&t(`A repeatable param (${i}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1/* TokenType.Param */,value:i,regexp:u,repeatable:"*"===c||"+"===c,optional:"*"===c||"?"===c})):t("Invalid state to consume buffer"),i="")}function p(){i+=c}for(;l<e.length;)if(c=e[l++],"\\"!==c||2/* TokenizerState.ParamRegExp */===n)switch(n){case 0/* TokenizerState.Static */:"/"===c?(i&&f(),s()):":"===c?(f(),n=1/* TokenizerState.Param */):p();break;case 4/* TokenizerState.EscapeNext */:p(),n=r;break;case 1/* TokenizerState.Param */:"("===c?n=2/* TokenizerState.ParamRegExp */:me.test(c)?p():(f(),n=0/* TokenizerState.Static */,
+// go back one character if we were not modifying
+"*"!==c&&"?"!==c&&"+"!==c&&l--);break;case 2/* TokenizerState.ParamRegExp */:
+// TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)
+// it already works by escaping the closing )
+// https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#
+// is this really something people need since you can also write
+// /prefix_:p()_suffix
+")"===c?
+// handle the escaped )
+"\\"==u[u.length-1]?u=u.slice(0,-1)+c:n=3/* TokenizerState.ParamRegExpEnd */:u+=c;break;case 3/* TokenizerState.ParamRegExpEnd */:
+// same as finalizing a param
+f(),n=0/* TokenizerState.Static */,
+// go back one character if we were not modifying
+"*"!==c&&"?"!==c&&"+"!==c&&l--,u="";break;default:t("Unknown state")}else r=n,n=4/* TokenizerState.EscapeNext */;
+// tokenCache.set(path, tokens)
+return 2/* TokenizerState.ParamRegExp */===n&&t(`Unfinished custom RegExp for param "${i}"`),f(),s(),o}(e.path),n),o=d(r,{record:e,parent:t,
+// these needs to be populated by the parent
+children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}
+/**
+ * Creates a Router Matcher.
+ *
+ * @internal
+ * @param routes - array of initial routes
+ * @param globalOptions - global route options
+ */function ve(e,t){
+// normalized ordered array of matchers
+const n=[],r=new Map;function o(e,n,r){
+// used later on to remove by name
+const c=!r,l=be(e);
+// we might be the child of an alias
+l.aliasOf=r&&r.record;const i=ke(t,e),u=[l];
+// generate an array of records to correctly handle aliases
+if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)u.push(
+// we need to normalize again to ensure the `mods` property
+// being non enumerable
+be(d({},l,{
+// this allows us to hold a copy of the `components` option
+// so that async components cache is hold on the original record
+components:r?r.record.components:l.components,path:e,
+// we might be the child of an alias
+aliasOf:r?r.record:l})))}let f,p;for(const t of u){const{path:u}=t;
+// Build up the path for nested routes if the child isn't an absolute
+// route. Only add the / delimiter if the child path isn't empty and if the
+// parent path doesn't have a trailing slash
+if(n&&"/"!==u[0]){const e=n.record.path,r="/"===e[e.length-1]?"":"/";t.path=n.record.path+(u&&r+u)}
+// create the object beforehand, so it can be passed to children
+if(f=ge(t,n,i),
+// if we are an alias we must tell the original record that we exist,
+// so we can be removed
+r?r.alias.push(f):(
+// otherwise, the first record is the original and others are aliases
+p=p||f,p!==f&&p.alias.push(f),
+// remove the route if named and only for the top record (avoid in nested calls)
+// this works because the original record is the first one
+c&&e.name&&!Ee(f)&&a(e.name)),
+// Avoid adding a record that doesn't display anything. This allows passing through records without a component to
+// not be reached and pass through the catch all route
+Oe(f)&&s(f),l.children){const e=l.children;for(let t=0;t<e.length;t++)o(e[t],f,r&&r.children[t])}
+// if there was no original record, then the first one was not an alias and all
+// other aliases (if any) need to reference this record when adding children
+r=r||f}return p?()=>{
+// since other matchers are aliases, they should be removed by the original matcher
+a(p)}:g}function a(e){if(re(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(a),t.alias.forEach(a))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(a),e.alias.forEach(a))}}function s(e){const t=
+/**
+ * Performs a binary search to find the correct insertion index for a new matcher.
+ *
+ * Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships,
+ * with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes.
+ *
+ * @param matcher - new matcher to be inserted
+ * @param matchers - existing matchers
+ */
+function(e,t){
+// First phase: binary search based on score
+let n=0,r=t.length;for(;n!==r;){const o=n+r>>1;pe(e,t[o])<0?r=o:n=o+1}
+// Second phase: check for an ancestor with the same score
+const o=function(e){let t=e;for(;t=t.parent;)if(Oe(t)&&0===pe(e,t))return t;return}
+/**
+ * Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without
+ * a component, or name, or redirect, are just used to group other routes.
+ * @param matcher
+ * @param matcher.record record of the matcher
+ * @returns
+ */(e);o&&(r=t.lastIndexOf(o,r-1));return r}(e,n);n.splice(t,0,e),
+// only add the original record to the name map
+e.record.name&&!Ee(e)&&r.set(e.record.name,e)}return t=ke({strict:!1,end:!0,sensitive:!1},t),
+// add initial routes
+e.forEach((e=>o(e))),{addRoute:o,resolve:function(e,t){let o,a,s,c={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw se(1/* ErrorTypes.MATCHER_NOT_FOUND */,{location:e});s=o.record.name,c=d(
+// paramsFromLocation is a new object
+ye(t.params,
+// only keep params that exist in the resolved location
+// only keep optional params coming from a parent record
+o.keys.filter((e=>!e.optional)).concat(o.parent?o.parent.keys.filter((e=>e.optional)):[]).map((e=>e.name))),
+// discard any existing params in the current location that do not exist here
+// #1497 this ensures better active/exact matching
+e.params&&ye(e.params,o.keys.map((e=>e.name)))),
+// throws if cannot be stringified
+a=o.stringify(c)}else if(null!=e.path)
+// no need to resolve the path with the matcher as it was provided
+// this also allows the user to control the encoding
+a=e.path,o=n.find((e=>e.re.test(a))),
+// matcher should have a value after the loop
+o&&(
+// we know the matcher works because we tested the regexp
+c=o.parse(a),s=o.record.name);else{if(
+// match by name or path of current route
+o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw se(1/* ErrorTypes.MATCHER_NOT_FOUND */,{location:e,currentLocation:t});s=o.record.name,
+// since we are navigating to the same location, we don't need to pick the
+// params like when `name` is provided
+c=d({},t.params,e.params),a=o.stringify(c)}const l=[];let i=o;for(;i;)
+// reversed order so parents are at the beginning
+l.unshift(i.record),i=i.parent;return{name:s,path:a,params:c,matched:l,meta:Re(l)}},removeRoute:a,clearRoutes:function(){n.length=0,r.clear()},getRoutes:function(){return n},getRecordMatcher:function(e){return r.get(e)}}}function ye(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}
+/**
+ * Normalizes a RouteRecordRaw. Creates a copy
+ *
+ * @param record
+ * @returns the normalized version
+ */function be(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:we(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},
+// must be declared afterwards
+// mods: {},
+components:"components"in e?e.components||null:e.component&&{default:e.component}};
+// mods contain modules and shouldn't be copied,
+// logged or anything. It's just used for internal
+// advanced use cases like data loaders
+return Object.defineProperty(t,"mods",{value:{}}),t}
+/**
+ * Normalize the optional `props` in a record to always be an object similar to
+ * components. Also accept a boolean for components.
+ * @param record
+ */function we(e){const t={},n=e.props||!1;
+// props does not exist on redirect records, but we can set false directly
+if("component"in e)t.default=n;else
+// NOTE: we could also allow a function to be applied to every component.
+// Would need user feedback for use cases
+for(const r in e.components)t[r]="object"==typeof n?n[r]:n;return t}
+/**
+ * Checks if a record or any of its parent is an alias
+ * @param record
+ */function Ee(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}
+/**
+ * Merge meta fields of an array of records
+ *
+ * @param matched - array of matched records
+ */function Re(e){return e.reduce(((e,t)=>d(e,t.meta)),{})}function ke(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Oe({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}
+/**
+ * Transforms a queryString into a {@link LocationQuery} object. Accept both, a
+ * version with the leading `?` and without Should work as URLSearchParams
+
+ * @internal
+ *
+ * @param search - search string to parse
+ * @returns a query object
+ */function xe(e){const t={};
+// avoid creating an object with an empty key and empty value
+// because of split('&')
+if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let r=0;r<n.length;++r){
+// pre decode the + into space
+const e=n[r].replace(k," "),o=e.indexOf("="),a=B(o<0?e:e.slice(0,o)),s=o<0?null:B(e.slice(o+1));
+// allow the = character
+if(a in t){
+// an extra variable for ts types
+let e=t[a];v(e)||(e=t[a]=[e]),e.push(s)}else t[a]=s}return t}
+/**
+ * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it
+ * doesn't prepend a `?`
+ *
+ * @internal
+ *
+ * @param query - query object to stringify
+ * @returns string version of the query without the leading `?`
+ */function Pe(e){let t="";for(let n in e){const r=e[n];if(n=L(n).replace(E,"%3D"),null==r){
+// only null adds the value
+void 0!==r&&(t+=(t.length?"&":"")+n);continue}
+// keep null values
+(v(r)?r.map((e=>e&&L(e))):[r&&L(r)]).forEach((e=>{
+// skip undefined values in arrays as if they were not present
+// smaller code than using filter
+void 0!==e&&(
+// only append & with non-empty search
+t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}))}return t}
+/**
+ * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting
+ * numbers into strings, removing keys with an undefined value and replacing
+ * undefined with null in arrays
+ *
+ * @param query - query object to normalize
+ * @returns a normalized query object
+ */function Ce(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=v(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}
+/**
+ * RouteRecord being rendered by the closest ancestor Router View. Used for
+ * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View
+ * Location Matched
+ *
+ * @internal
+ */const je=Symbol(""),$e=Symbol(""),Se=Symbol(""),Ae=Symbol(""),qe=Symbol("");
+/**
+ * Allows overriding the router view depth to control which component in
+ * `matched` is rendered. rvd stands for Router View Depth
+ *
+ * @internal
+ */
+/**
+ * Create a list of callbacks that can be reset. Used to create before and after navigation guards list
+ */
+function Le(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Me(e,t,n,r,o,a=e=>e()){
+// keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place
+const s=r&&(
+// name is defined if record is because of the function overload
+r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((c,l)=>{const i=e=>{var a;!1===e?l(se(4/* ErrorTypes.NAVIGATION_ABORTED */,{from:n,to:t})):e instanceof Error?l(e):"string"==typeof(a=e)||a&&"object"==typeof a?l(se(2/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */,{from:t,to:e})):(s&&
+// since enterCallbackArray is truthy, both record and name also are
+r.enterCallbacks[o]===s&&"function"==typeof e&&s.push(e),c())},u=a((()=>e.call(r&&r.instances[o],t,n,i)));
+// wrapping with Promise.resolve allows it to work with both async and sync guards
+let f=Promise.resolve(u);e.length<3&&(f=f.then(i)),f.catch((e=>l(e)))}))}function Be(e,t,n,r,o=e=>e()){const a=[];for(const s of e)for(const e in s.components){let c=s.components[e];
+// skip update and leave guards if the route component is not mounted
+if("beforeRouteEnter"===t||s.instances[e])if(h(c)){
+// __vccOpts is added by vue-class-component and contain the regular options
+const l=(c.__vccOpts||c)[t];l&&a.push(Me(l,n,r,s,e,o))}else{
+// start requesting the chunk already
+let l=c();a.push((()=>l.then((a=>{if(!a)throw new Error(`Couldn't resolve component "${e}" at "${s.path}"`);const c=(l=a).__esModule||"Module"===l[Symbol.toStringTag]||
+// support CF with dynamic imports that do not
+// add the Module string tag
+l.default&&h(l.default)?a.default:a;
+// keep the resolved module for plugins like data loaders
+var l;s.mods[e]=a,
+// replace the function with the resolved component
+// cannot be null or undefined because we went into the for loop
+s.components[e]=c;
+// __vccOpts is added by vue-class-component and contain the regular options
+const i=(c.__vccOpts||c)[t];return i&&Me(i,n,r,s,e,o)()}))))}}return a}
+// TODO: we could allow currentRoute as a prop to expose `isActive` and
+// `isExactActive` behavior should go through an RFC
+/**
+ * Returns the internal behavior of a {@link RouterLink} without the rendering part.
+ *
+ * @param props - a `to` location and an optional `replace` flag
+ */function Ge(e){const n=o(Se),r=o(Ae),a=c((()=>{const r=t(e.to);return n.resolve(r)})),s=c((()=>{const{matched:e}=a.value,{length:t}=e,n=e[t-1],o=r.matched;if(!n||!o.length)return-1;const s=o.findIndex(T.bind(null,n));if(s>-1)return s;
+// possible parent record
+const c=Ie(e[t-2]);
+// we are dealing with nested routes
+return t>1&&
+// if the parent and matched route have the same path, this link is
+// referring to the empty child. Or we currently are on a different
+// child of the same parent
+Ie(n)===c&&
+// avoid comparing the child with its parent
+o[o.length-1].path!==c?o.findIndex(T.bind(null,e[t-2])):s})),l=c((()=>s.value>-1&&function(e,t){for(const n in t){const r=t[n],o=e[n];if("string"==typeof r){if(r!==o)return!1}else if(!v(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}
+/**
+ * Get the original path value of a record by following its aliasOf
+ * @param record
+ */(r.params,a.value.params))),i=c((()=>s.value>-1&&s.value===r.matched.length-1&&W(r.params,a.value.params)));
+/**
+     * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this
+     */
+return{route:a,href:c((()=>a.value.href)),isActive:l,isExactActive:i,navigate:function(r={}){if(function(e){
+// don't redirect with control keys
+if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;
+// don't redirect when preventDefault called
+if(e.defaultPrevented)return;
+// don't redirect on right click
+if(void 0!==e.button&&0!==e.button)return;
+// don't redirect if `target="_blank"`
+// @ts-expect-error getAttribute does exist
+if(e.currentTarget&&e.currentTarget.getAttribute){
+// @ts-expect-error getAttribute exists
+const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}
+// this may be a Weex event which doesn't have this method
+e.preventDefault&&e.preventDefault();return!0}(r)){const r=n[t(e.replace)?"replace":"push"](t(e.to)).catch(g);return e.viewTransition&&"undefined"!=typeof document&&"startViewTransition"in document&&document.startViewTransition((()=>r)),r}return Promise.resolve()}}}const _e=a({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,
+// inactiveClass: String,
+exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ge,setup(e,{slots:t}){const n=s(Ge(e)),{options:r}=o(Se),a=c((()=>({[Te(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,
+// [getLinkClass(
+//   props.inactiveClass,
+//   options.linkInactiveClass,
+//   'router-link-inactive'
+// )]: !link.isExactActive,
+[Te(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const r=t.default&&(1===(o=t.default(n)).length?o[0]:o);var o;return e.custom?r:l("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,
+// this would override user added attrs but Vue will still add
+// the listener, so we end up triggering both
+onClick:n.navigate,class:a.value},r)}}});
+// export the public type for h/tsx inference
+// also to avoid inline import() in generated d.ts files
+/**
+ * Component to render a link that triggers a navigation on click.
+ */function Ie(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}
+/**
+ * Utility class to get the active class based on defaults.
+ * @param propClass
+ * @param globalClass
+ * @param defaultClass
+ */const Te=(e,t,n)=>null!=e?e:null!=t?t:n;function We(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}
+// export the public type for h/tsx inference
+// also to avoid inline import() in generated d.ts files
+/**
+ * Component to display the current route the user is at.
+ */const De=a({name:"RouterView",
+// #674 we manually inherit them
+inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},
+// Better compat for @vue/compat users
+// https://github.com/vuejs/router/issues/1315
+compatConfig:{MODE:3},setup(e,{attrs:n,slots:r}){const a=o(qe),s=c((()=>e.route||a.value)),p=o($e,0),h=c((()=>{let e=t(p);const{matched:n}=s.value;let r;for(;(r=n[e])&&!r.components;)e++;return e})),m=c((()=>s.value.matched[h.value]));i($e,c((()=>h.value+1))),i(je,m),i(qe,s);const g=u();
+// watch at the same time the component instance, the route record we are
+// rendering, and the name
+return f((()=>[g.value,m.value,e.name]),(([e,t,n],[r,o,a])=>{
+// copy reused instances
+t&&(
+// this will update the instance for new instances as well as reused
+// instances when navigating to a new route
+t.instances[n]=e,
+// the component instance is reused for a different route or name, so
+// we copy any saved update or leave guards. With async setup, the
+// mounting component will mount before the matchedRoute changes,
+// making instance === oldInstance, so we check if guards have been
+// added before. This works because we remove guards when
+// unmounting/deactivating components
+o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),
+// trigger beforeRouteEnter next callbacks
+!e||!t||
+// if there is no instance but to and from are the same this might be
+// the first visit
+o&&T(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const t=s.value,o=e.name,a=m.value,c=a&&a.components[o];
+// we need the value at the time we render because when we unmount, we
+// navigated to a different location so the value is different
+if(!c)return We(r.default,{Component:c,route:t});
+// props from route configuration
+const i=a.props[o],u=i?!0===i?t.params:"function"==typeof i?i(t):i:null,f=l(c,d({},u,n,{onVnodeUnmounted:e=>{
+// remove the instance reference to prevent leak
+e.component.isUnmounted&&(a.instances[o]=null)},ref:g}));
+// pass the vnode to the slot as a prop.
+// h and <component :is="..."> both accept vnodes
+return We(r.default,{Component:f,route:t})||f}}});
+/**
+ * Creates a Router instance that can be used by a Vue app.
+ *
+ * @param options - {@link RouterOptions}
+ */function Ue(o){const a=ve(o.routes,o),s=o.parseQuery||xe,c=o.stringifyQuery||Pe,l=o.history,i=Le(),u=Le(),f=Le(),h=e(V);let y=V;
+// leave the scrollRestoration if no scrollBehavior is provided
+p&&o.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const b=m.bind(null,(e=>""+e)),w=m.bind(null,M),E=
+// @ts-expect-error: intentionally avoid the type check
+m.bind(null,B);function R(e,t){if(
+// const resolve: Router['resolve'] = (rawLocation: RouteLocationRaw, currentLocation) => {
+// const objectLocation = routerLocationAsObject(rawLocation)
+// we create a copy to modify it later
+t=d({},t||h.value),"string"==typeof e){const n=_(s,e,t.path),r=a.resolve({path:n.path},t),o=l.createHref(n.fullPath);
+// locationNormalized is always a new object
+return d(n,r,{params:E(r.params),hash:B(n.hash),redirectedFrom:void 0,href:o})}let n;
+// path could be relative in object as well
+if(null!=e.path)n=d({},e,{path:_(s,e.path,t.path).path});else{
+// remove any nullish param
+const r=d({},e.params);for(const e in r)null==r[e]&&delete r[e];
+// pass encoded values to the matcher, so it can produce encoded path and fullPath
+n=d({},e,{params:w(r)}),
+// current location params are decoded, we need to encode them in case the
+// matcher merges the params
+t.params=w(t.params)}const r=a.resolve(n,t),o=e.hash||"";
+// the matcher might have merged current location params, so
+// we need to run the decoding again
+r.params=b(E(r.params));const i=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(c,d({},e,{hash:(u=o,q(u).replace(j,"{").replace(S,"}").replace(P,"^")),path:r.path}));var u;const f=l.createHref(i);return d({fullPath:i,
+// keep the hash encoded so fullPath is effectively path + encodedQuery +
+// hash
+hash:o,query:
+// if the user is using a custom query lib like qs, we might have
+// nested objects, so we keep the query as is, meaning it can contain
+// numbers at `$route.query`, but at the point, the user will have to
+// use their own type anyway.
+// https://github.com/vuejs/router/issues/328#issuecomment-649481567
+c===Pe?Ce(e.query):e.query||{}},r,{redirectedFrom:void 0,href:f})}function k(e){return"string"==typeof e?_(s,e,h.value.path):d({},e)}function O(e,t){if(y!==e)return se(8/* ErrorTypes.NAVIGATION_CANCELLED */,{from:t,to:e})}function x(e){return $(e)}function C(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let r="function"==typeof n?n(e):n;return"string"==typeof r&&(r=r.includes("?")||r.includes("#")?r=k(r):// force empty params
+{path:r},
+// @ts-expect-error: force empty params when a string is passed to let
+// the router parse them again
+r.params={}),d({query:e.query,hash:e.hash,
+// avoid transferring params if the redirect has a path
+params:null!=r.path?{}:e.params},r)}}function $(e,t){const n=y=R(e),r=h.value,o=e.state,a=e.force,s=!0===e.replace,l=C(n);if(l)return $(d(k(l),{state:"object"==typeof l?d({},o,l.state):o,force:a,replace:s}),
+// keep original redirectedFrom if it exists
+t||n);
+// if it was a redirect we already called `pushWithRedirect` above
+const i=n;let u;return i.redirectedFrom=t,!a&&function(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&T(t.matched[r],n.matched[o])&&W(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(c,r,n)&&(u=se(16/* ErrorTypes.NAVIGATION_DUPLICATED */,{to:i,from:r}),
+// trigger scroll to allow scrolling to the same anchor
+te(r,r,
+// this is a push, the only way for it to be triggered from a
+// history.listen is with a redirect, which makes it become a push
+!0,
+// This cannot be the first navigation because the initial location
+// cannot be manually navigated to
+!1)),(u?Promise.resolve(u):G(i,r)).catch((e=>ce(e)?// navigation redirects still mark the router as ready
+ce(e,2/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)?e:ee(e):// reject any unknown error
+J(e,i,r))).then((e=>{if(e){if(ce(e,2/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */))return $(
+// keep options
+d({
+// preserve an existing replacement but allow the redirect to override it
+replace:s},k(e.to),{state:"object"==typeof e.to?d({},o,e.to.state):o,force:a}),
+// preserve the original redirectedFrom if any
+t||i)}else
+// if we fail we don't finalize the navigation
+e=D(i,r,!0,s,o);return I(i,r,e),e}))}
+/**
+     * Helper to reject and skip all navigation guards if a new navigation happened
+     * @param to
+     * @param from
+     */function A(e,t){const n=O(e,t);return n?Promise.reject(n):Promise.resolve()}function L(e){const t=ae.values().next().value;
+// support Vue < 3.3
+return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}
+// TODO: refactor the whole before guards by internally using router.beforeEach
+function G(e,t){let n;const[r,o,a]=function(e,t){const n=[],r=[],o=[],a=Math.max(t.matched.length,e.matched.length);for(let s=0;s<a;s++){const a=t.matched[s];a&&(e.matched.find((e=>T(e,a)))?r.push(a):n.push(a));const c=e.matched[s];c&&(
+// the type doesn't matter because we are comparing per reference
+t.matched.find((e=>T(e,c)))||o.push(c))}return[n,r,o]}
+/**
+ * Returns the router instance. Equivalent to using `$router` inside
+ * templates.
+ */(e,t);
+// all components here have been resolved once because we are leaving
+n=Be(r.reverse(),"beforeRouteLeave",e,t);
+// leavingRecords is already reversed
+for(const c of r)c.leaveGuards.forEach((r=>{n.push(Me(r,e,t))}));const s=A.bind(null,e,t);
+// run the queue of per route beforeRouteLeave guards
+return n.push(s),ie(n).then((()=>{
+// check global guards beforeEach
+n=[];for(const r of i.list())n.push(Me(r,e,t));return n.push(s),ie(n)})).then((()=>{
+// check in components beforeRouteUpdate
+n=Be(o,"beforeRouteUpdate",e,t);for(const r of o)r.updateGuards.forEach((r=>{n.push(Me(r,e,t))}));
+// run the queue of per route beforeEnter guards
+return n.push(s),ie(n)})).then((()=>{
+// check the route beforeEnter
+n=[];for(const r of a)
+// do not trigger beforeEnter on reused views
+if(r.beforeEnter)if(v(r.beforeEnter))for(const o of r.beforeEnter)n.push(Me(o,e,t));else n.push(Me(r.beforeEnter,e,t));
+// run the queue of per route beforeEnter guards
+return n.push(s),ie(n)})).then((()=>(
+// NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>
+// clear existing enterCallbacks, these are added by extractComponentsGuards
+e.matched.forEach((e=>e.enterCallbacks={})),
+// check in-component beforeRouteEnter
+n=Be(a,"beforeRouteEnter",e,t,L),n.push(s),ie(n)))).then((()=>{
+// check global guards beforeResolve
+n=[];for(const r of u.list())n.push(Me(r,e,t));return n.push(s),ie(n)})).catch((e=>ce(e,8/* ErrorTypes.NAVIGATION_CANCELLED */)?e:Promise.reject(e)))}function I(e,t,n){
+// navigation is confirmed, call afterGuards
+// TODO: wrap with error handlers
+f.list().forEach((r=>L((()=>r(e,t,n)))))}
+/**
+     * - Cleans up any navigation guards
+     * - Changes the url if necessary
+     * - Calls the scrollBehavior
+     */function D(e,t,n,r,o){
+// a more recent navigation took place
+const a=O(e,t);if(a)return a;
+// only consider as push if it's not the first navigation
+const s=t===V,c=p?history.state:{};
+// change URL only if the user did a push/replace and if it's not the initial navigation because
+// it's just reflecting the url
+n&&(
+// on the initial navigation, we want to reuse the scroll position from
+// history state if it exists
+r||s?l.replace(e.fullPath,d({scroll:s&&c&&c.scroll},o)):l.push(e.fullPath,o)),
+// accept current navigation
+h.value=e,te(e,t,n,s),ee()}let U;
+// attach listener to history to trigger navigations
+function z(){
+// avoid setting up listeners twice due to an invalid first navigation
+U||(U=l.listen(((e,t,n)=>{if(!le.listening)return;
+// cannot be a redirect route because it was in history
+const r=R(e),o=C(r);
+// due to dynamic routing, and to hash history with manual navigation
+// (manually changing the url or calling history.hash = '#/somewhere'),
+// there could be a redirect record in history
+if(o)return void $(d(o,{replace:!0,force:!0}),r).catch(g);y=r;const a=h.value;
+// TODO: should be moved to web history?
+var s,c;p&&(s=N(a.fullPath,n.delta),c=Q(),Z.set(s,c)),G(r,a).catch((e=>ce(e,12/* ErrorTypes.NAVIGATION_CANCELLED */)?e:ce(e,2/* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)?(
+// Here we could call if (info.delta) routerHistory.go(-info.delta,
+// false) but this is bug prone as we have no way to wait the
+// navigation to be finished before calling pushWithRedirect. Using
+// a setTimeout of 16ms seems to work but there is no guarantee for
+// it to work on every browser. So instead we do not restore the
+// history entry and trigger a new navigation as requested by the
+// navigation guard.
+// the error is already handled by router.push we just want to avoid
+// logging the error
+$(d(k(e.to),{force:!0}),r).then((e=>{
+// manual change in hash history #916 ending up in the URL not
+// changing, but it was changed by the manual url change, so we
+// need to manually change it ourselves
+ce(e,20/* ErrorTypes.NAVIGATION_DUPLICATED */)&&!n.delta&&n.type===F.pop&&l.go(-1,!1)})).catch(g),Promise.reject()):(
+// do not restore history on unknown direction
+n.delta&&l.go(-n.delta,!1),J(e,r,a)))).then((e=>{
+// revert the navigation
+(e=e||D(
+// after navigation, all matched components are resolved
+r,a,!1))&&(n.delta&&
+// a new navigation has been triggered, so we do not want to revert, that will change the current history
+// entry while a different route is displayed
+!ce(e,8/* ErrorTypes.NAVIGATION_CANCELLED */)?l.go(-n.delta,!1):n.type===F.pop&&ce(e,20/* ErrorTypes.NAVIGATION_DUPLICATED */)&&
+// manual change in hash history #916
+// it's like a push but lacks the information of the direction
+l.go(-1,!1)),I(r,a,e)})).catch(g)})))}
+// Initialization and Errors
+let K,H=Le(),X=Le();
+/**
+     * Trigger errorListeners added via onError and throws the error as well
+     *
+     * @param error - error to throw
+     * @param to - location we were navigating to when the error happened
+     * @param from - location we were navigating from when the error happened
+     * @returns the error as a rejected promise
+     */
+function J(e,t,n){ee(e);const r=X.list();
+// reject the error no matter there were error listeners or not
+return r.length&&r.forEach((r=>r(e,t,n))),Promise.reject(e)}function ee(e){return K||(
+// still not ready if an error happened
+K=!e,z(),H.list().forEach((([t,n])=>e?n(e):t())),H.reset()),e}
+// Scroll behavior
+function te(e,t,n,a){const{scrollBehavior:s}=o;if(!p||!s)return Promise.resolve();const c=!n&&function(e){const t=Z.get(e);
+// consume it so it's not used again
+return Z.delete(e),t}(N(e.fullPath,0))||(a||!n)&&history.state&&history.state.scroll||null;return r().then((()=>s(e,t,c))).then((e=>e&&Y(e))).catch((n=>J(n,e,t)))}const ne=e=>l.go(e);let oe;const ae=new Set,le={currentRoute:h,listening:!0,addRoute:function(e,t){let n,r;return re(e)?(n=a.getRecordMatcher(e),r=t):r=e,a.addRoute(r,n)},removeRoute:function(e){const t=a.getRecordMatcher(e);t&&a.removeRoute(t)},clearRoutes:a.clearRoutes,hasRoute:function(e){return!!a.getRecordMatcher(e)},getRoutes:function(){return a.getRoutes().map((e=>e.record))},resolve:R,options:o,push:x,replace:function(e){return x(d(k(e),{replace:!0}))},go:ne,back:()=>ne(-1),forward:()=>ne(1),beforeEach:i.add,beforeResolve:u.add,afterEach:f.add,onError:X.add,isReady:function(){return K&&h.value!==V?Promise.resolve():new Promise(((e,t)=>{H.add([e,t])}))},install(e){e.component("RouterLink",_e),e.component("RouterView",De),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>t(h)}),
+// this initial navigation is only necessary on client, on server it doesn't
+// make sense because it will create an extra unnecessary navigation and could
+// lead to problems
+p&&
+// used for the initial navigation client side to avoid pushing
+// multiple times when the router is used in multiple apps
+!oe&&h.value===V&&(
+// see above
+oe=!0,x(l.location).catch((e=>{})));const r={};for(const t in V)Object.defineProperty(r,t,{get:()=>h.value[t],enumerable:!0});e.provide(Se,this),e.provide(Ae,n(r)),e.provide(qe,h);const o=e.unmount;ae.add(e),e.unmount=function(){ae.delete(e),
+// the router is not attached to an app anymore
+ae.size<1&&(
+// invalidate the current navigation
+y=V,U&&U(),U=null,h.value=V,oe=!1,K=!1),o()}}};
+// TODO: type this as NavigationGuardReturn or similar instead of any
+function ie(e){return e.reduce(((e,t)=>e.then((()=>L(t)))),Promise.resolve())}return le}function Ve(){return o(Se)}
+/**
+ * Returns the current route location. Equivalent to using `$route` inside
+ * templates.
+ */function Fe(e){return o(Ae)}export{ne as a,Fe as b,Ue as c,Ve as u};
+//# sourceMappingURL=vue-router-c7cbbcaa.js.map

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/assets/js/zrender-ee9f2f6d.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
plant2-demo/datav/logo.ico


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است