You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/10/17 22:21:21 UTC

[camel-karavan] 01/02: Topology in Designer for #939

This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit 9c953210d84453e8f2d5d06b6086745f2f16dd1f
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Tue Oct 17 08:47:47 2023 -0400

    Topology in Designer for #939
---
 karavan-designer/package-lock.json                 |  152 +-
 karavan-designer/package.json                      |   20 +-
 .../src}/topology/CustomEdge.tsx                   |    4 +-
 .../src}/topology/CustomGroup.tsx                  |    1 -
 .../src}/topology/CustomNode.tsx                   |    4 +-
 .../src}/topology/TopologyApi.tsx                  |    6 +-
 .../src}/topology/TopologyPropertiesPanel.tsx      |   19 +-
 .../src}/topology/TopologyStore.ts                 |   10 +
 .../src}/topology/TopologyTab.tsx                  |   25 +-
 .../src}/topology/TopologyToolbar.tsx              |   12 +-
 .../src}/topology/topology.css                     |    0
 karavan-space/package-lock.json                    | 1612 +++++++++++++++-----
 karavan-space/package.json                         |   22 +-
 karavan-space/src/designer/route/DslElement.tsx    |    4 +-
 .../src}/topology/CustomEdge.tsx                   |    4 +-
 .../src}/topology/CustomGroup.tsx                  |    1 -
 .../src}/topology/CustomNode.tsx                   |    4 +-
 .../src}/topology/TopologyApi.tsx                  |    6 +-
 .../src}/topology/TopologyPropertiesPanel.tsx      |   19 +-
 .../src}/topology/TopologyStore.ts                 |   10 +
 .../src}/topology/TopologyTab.tsx                  |   25 +-
 .../src}/topology/TopologyToolbar.tsx              |   12 +-
 .../src}/topology/topology.css                     |    0
 .../karavan-app/src/main/webui/package-lock.json   |  152 +-
 .../karavan-app/src/main/webui/package.json        |   29 +-
 .../main/webui/src/designer/route/DslElement.tsx   |    4 +-
 .../src/main/webui/src/project/ProjectPanel.tsx    |    9 +-
 ...{TopologyToolbar.tsx => ProjectTopologyTab.tsx} |   48 +-
 .../src/{project => }/topology/CustomEdge.tsx      |    4 +-
 .../src/{project => }/topology/CustomGroup.tsx     |    1 -
 .../src/{project => }/topology/CustomNode.tsx      |    4 +-
 .../src/{project => }/topology/TopologyApi.tsx     |    6 +-
 .../topology/TopologyPropertiesPanel.tsx           |   19 +-
 .../src/{project => }/topology/TopologyStore.ts    |   10 +
 .../src/{project => }/topology/TopologyTab.tsx     |   25 +-
 .../src/{project => }/topology/TopologyToolbar.tsx |   12 +-
 .../webui/src/{project => }/topology/topology.css  |    0
 37 files changed, 1557 insertions(+), 738 deletions(-)

diff --git a/karavan-designer/package-lock.json b/karavan-designer/package-lock.json
index 6e8dc28d..29280923 100644
--- a/karavan-designer/package-lock.json
+++ b/karavan-designer/package-lock.json
@@ -9,23 +9,23 @@
       "version": "4.0.1",
       "license": "Apache-2.0",
       "dependencies": {
-        "@monaco-editor/react": "^4.5.2",
-        "@patternfly/patternfly": "^5.0.2",
-        "@patternfly/react-core": "^5.0.0",
-        "@patternfly/react-table": "^5.0.0",
-        "@patternfly/react-topology": "^5.0.0",
-        "@types/js-yaml": "4.0.5",
+        "@monaco-editor/react": "^4.6.0",
+        "@patternfly/patternfly": "^5.1.0",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-table": "^5.1.1",
+        "@patternfly/react-topology": "^5.1.0",
+        "@types/js-yaml": "4.0.7",
         "@types/node": "18.16.3",
-        "@types/uuid": "9.0.1",
-        "axios": "1.4.0",
+        "@types/uuid": "9.0.5",
+        "axios": "1.5.1",
         "dagre": "0.8.5",
         "html-to-image": "1.11.11",
         "karavan-core": "file:../karavan-core",
         "react": "18.2.0",
         "react-dom": "18.2.0",
         "rxjs": "7.8.1",
-        "uuid": "9.0.0",
-        "zustand": "^4.4.1"
+        "uuid": "9.0.1",
+        "zustand": "^4.4.3"
       },
       "devDependencies": {
         "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
@@ -2097,9 +2097,9 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz",
-      "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+      "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.22.13",
@@ -3356,9 +3356,9 @@
       "dev": true
     },
     "node_modules/@monaco-editor/loader": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.3.tgz",
-      "integrity": "sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz",
+      "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==",
       "dependencies": {
         "state-local": "^1.0.6"
       },
@@ -3367,11 +3367,11 @@
       }
     },
     "node_modules/@monaco-editor/react": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.5.2.tgz",
-      "integrity": "sha512-emcWu6vg1OpXPiYll4aPOaXe8bwYB4UaaNTwtArFLgMoNGBzRZb2Xn0Bra2HMIFM7QLgs7fCGunHO5LkfT2LBA==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz",
+      "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==",
       "dependencies": {
-        "@monaco-editor/loader": "^1.3.3"
+        "@monaco-editor/loader": "^1.4.0"
       },
       "peerDependencies": {
         "monaco-editor": ">= 0.25.0 < 1",
@@ -3424,19 +3424,19 @@
       }
     },
     "node_modules/@patternfly/patternfly": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.4.tgz",
-      "integrity": "sha512-8akdWzFpG384Q6Es8lzkfuhAlzVGrNK7TJqXGecHDAg8u1JsYn3+Nw6gLRviI88z8Kjxmg5YKirILjpclGxkIA=="
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.1.0.tgz",
+      "integrity": "sha512-wzVgL/0xPsmuRKWc6lMNEo5gDcTUtyU231eJSBTapOKXiwBOv2flvLEHPYLO6oDYXO+hwUrVgbcZFWMd1UlLwA=="
     },
     "node_modules/@patternfly/react-core": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.1.tgz",
-      "integrity": "sha512-Eevd+8ACLFV733J+cpo4FRgNtRBObIgmUcrqLjf9H99jZ1hFpBgacFyHiALFi2cuoNVGmdEzskFl+4c7Uo0n+w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.1.1.tgz",
+      "integrity": "sha512-9DbgQMXYmF8A4aCNLKXwIN1H07SIPoPaVLvx+yiDuJfDx4Qi0T+H7j5cx0VfDfxuCpqea3POJWqBQn1HnwS4wQ==",
       "dependencies": {
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
-        "focus-trap": "7.4.3",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
+        "focus-trap": "7.5.2",
         "react-dropzone": "^14.2.3",
         "tslib": "^2.5.0"
       },
@@ -3446,28 +3446,28 @@
       }
     },
     "node_modules/@patternfly/react-icons": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.1.tgz",
-      "integrity": "sha512-MduetDRzve3eRlKAioM/UxmVuPyFccdeBWAKhbN4SBn7RaZWS7kO7/xZzNkpeT5pqQIeAACvz3uiV2/3uAf38w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.1.1.tgz",
+      "integrity": "sha512-9gCxkWz2xcdi0rtXu2F0L68w4tLIlsgGTACo1ggr4aVng9jRX++o1PlCOqscOd9o0NiFnFD7BLlZUGvJWaYEZg==",
       "peerDependencies": {
         "react": "^17 || ^18",
         "react-dom": "^17 || ^18"
       }
     },
     "node_modules/@patternfly/react-styles": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.1.tgz",
-      "integrity": "sha512-kHP/lbvmhBnNfWiqJJLNwOQZnkcl6wfwAesRp22s4Lj941EWe0oFIqn925/uORIOAOz2du1121t7T4UTfLZg4w=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.1.1.tgz",
+      "integrity": "sha512-swO9X+WixYYDsMVsEJp1V8QUfhEQY91QfFm4phfYP4jc2TQ2opIFYdUIHkc+yrZwBhrgb/pPUUfemyqAoSbZcA=="
     },
     "node_modules/@patternfly/react-table": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.1.tgz",
-      "integrity": "sha512-2YbM6XvgG9ubJE4caPQKPMFBkcf7zYzLUFbHnkyfInpWeVNBs/+ZDAP2wnIHce7uaPLnJ1t0FVzGwaD/UuPwkg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.1.1.tgz",
+      "integrity": "sha512-9tAtHj16hemJ6YRBWIm2O+QRNoFWYQt8ZLQ1G0KBwpg2t2G2CbGsS2RG+BamO4IVE6IPo3Yoo39p4UCNRiGVpA==",
       "dependencies": {
-        "@patternfly/react-core": "^5.0.1",
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
         "lodash": "^4.17.19",
         "tslib": "^2.5.0"
       },
@@ -3477,18 +3477,18 @@
       }
     },
     "node_modules/@patternfly/react-tokens": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.1.tgz",
-      "integrity": "sha512-YafAGJYvxDP4GaQ0vMybalWmx7MJ+etUf1cGoaMh0wRD2eswltT/RckygtEBKR/M61qXbgG+CxKmMyY8leoiDw=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.1.1.tgz",
+      "integrity": "sha512-cHuNkzNA9IY9aDwfjSEkitQoVEvRhOJRKhH0yIRlRByEkbdoV9jJZ9xj20hNShE+bxmNuom+MCTQSkpkN1bV8A=="
     },
     "node_modules/@patternfly/react-topology": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-5.0.0.tgz",
-      "integrity": "sha512-DW1dXXff5X+5K3ZW8rn1eqSggGfq5My/BMMcyhO6ankgAxAA4uK96/DbWaUMmSxkeHDSF6tD5jTd/SiglQzR1A==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-5.1.0.tgz",
+      "integrity": "sha512-Qzu7GMxqCsRvQj4RF2AHOGSp0nPpVuDE2xpdAaj/yCKz0cqHhvrwpC4+qyVL3mlqIs5qb+Fxm2d81Do7YIx3ig==",
       "dependencies": {
-        "@patternfly/react-core": "^5.0.0",
-        "@patternfly/react-icons": "^5.0.0",
-        "@patternfly/react-styles": "^5.0.0",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
         "@types/d3": "^7.4.0",
         "@types/d3-force": "^1.2.1",
         "@types/dagre": "0.7.42",
@@ -4382,9 +4382,9 @@
       }
     },
     "node_modules/@types/js-yaml": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz",
-      "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA=="
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.7.tgz",
+      "integrity": "sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg=="
     },
     "node_modules/@types/json-schema": {
       "version": "7.0.13",
@@ -4543,9 +4543,9 @@
       "dev": true
     },
     "node_modules/@types/uuid": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz",
-      "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA=="
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.5.tgz",
+      "integrity": "sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ=="
     },
     "node_modules/@types/ws": {
       "version": "8.5.6",
@@ -5545,9 +5545,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
-      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -9211,11 +9211,11 @@
       "dev": true
     },
     "node_modules/focus-trap": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz",
-      "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==",
+      "version": "7.5.2",
+      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz",
+      "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==",
       "dependencies": {
-        "tabbable": "^6.1.2"
+        "tabbable": "^6.2.0"
       }
     },
     "node_modules/follow-redirects": {
@@ -14556,9 +14556,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.30",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz",
-      "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==",
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
       "dev": true,
       "funding": [
         {
@@ -18674,9 +18674,13 @@
       }
     },
     "node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -19780,9 +19784,9 @@
       }
     },
     "node_modules/zustand": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.1.tgz",
-      "integrity": "sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==",
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.3.tgz",
+      "integrity": "sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==",
       "dependencies": {
         "use-sync-external-store": "1.2.0"
       },
diff --git a/karavan-designer/package.json b/karavan-designer/package.json
index 4f9dd64f..337c4f14 100644
--- a/karavan-designer/package.json
+++ b/karavan-designer/package.json
@@ -26,23 +26,23 @@
     ]
   },
   "dependencies": {
-    "@monaco-editor/react": "^4.5.2",
-    "@patternfly/patternfly": "^5.0.2",
-    "@patternfly/react-core": "^5.0.0",
-    "@patternfly/react-table": "^5.0.0",
-    "@patternfly/react-topology": "^5.0.0",
-    "@types/js-yaml": "4.0.5",
+    "@monaco-editor/react": "^4.6.0",
+    "@patternfly/patternfly": "^5.1.0",
+    "@patternfly/react-core": "^5.1.1",
+    "@patternfly/react-table": "^5.1.1",
+    "@patternfly/react-topology": "^5.1.0",
+    "@types/js-yaml": "4.0.7",
     "@types/node": "18.16.3",
-    "@types/uuid": "9.0.1",
-    "axios": "1.4.0",
+    "@types/uuid": "9.0.5",
+    "axios": "1.5.1",
     "dagre": "0.8.5",
     "html-to-image": "1.11.11",
     "karavan-core": "file:../karavan-core",
     "react": "18.2.0",
     "react-dom": "18.2.0",
     "rxjs": "7.8.1",
-    "uuid": "9.0.0",
-    "zustand": "^4.4.1"
+    "uuid": "9.0.1",
+    "zustand": "^4.4.3"
   },
   "devDependencies": {
     "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx b/karavan-designer/src/topology/CustomEdge.tsx
similarity index 87%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
copy to karavan-designer/src/topology/CustomEdge.tsx
index 0eb8e0eb..bd4fa92e 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
+++ b/karavan-designer/src/topology/CustomEdge.tsx
@@ -18,12 +18,10 @@
 import * as React from 'react';
 
 import './topology.css';
-import {DefaultEdge, DefaultGroup, observer} from '@patternfly/react-topology';
+import {DefaultEdge, observer} from '@patternfly/react-topology';
 
 
 const CustomEdge: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
-
     return (
         <DefaultEdge element={element} {...rest}>
         </DefaultEdge>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx b/karavan-designer/src/topology/CustomGroup.tsx
similarity index 94%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
copy to karavan-designer/src/topology/CustomGroup.tsx
index 7df861ce..9e366c7c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
+++ b/karavan-designer/src/topology/CustomGroup.tsx
@@ -22,7 +22,6 @@ import { DefaultGroup, observer} from '@patternfly/react-topology';
 
 
 const CustomGroup: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
 
     return (
         <DefaultGroup element={element} {...rest}>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx b/karavan-designer/src/topology/CustomNode.tsx
similarity index 92%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
copy to karavan-designer/src/topology/CustomNode.tsx
index 12492fdf..2d87457d 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
+++ b/karavan-designer/src/topology/CustomNode.tsx
@@ -19,8 +19,8 @@ import * as React from 'react';
 import {RegionsIcon} from '@patternfly/react-icons';
 
 import {DefaultNode, observer} from '@patternfly/react-topology';
-import {getDesignerIcon} from "../../designer/utils/KaravanIcons";
-import {CamelUi} from "../../designer/utils/CamelUi";
+import {getDesignerIcon} from "../designer/utils/KaravanIcons";
+import {CamelUi} from "../designer/utils/CamelUi";
 import './topology.css';
 
 function getIcon(data: any) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx b/karavan-designer/src/topology/TopologyApi.tsx
similarity index 97%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
copy to karavan-designer/src/topology/TopologyApi.tsx
index d9ec3ba9..44ff57a2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
+++ b/karavan-designer/src/topology/TopologyApi.tsx
@@ -29,7 +29,6 @@ import {
     withPanZoom, withSelection
 } from '@patternfly/react-topology';
 import CustomNode from "./CustomNode";
-import {ProjectFile} from "../../api/ProjectModels";
 import {Integration} from "karavan-core/lib/model/IntegrationDefinition";
 import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
 import {TopologyUtils} from "karavan-core/lib/api/TopologyUtils";
@@ -41,10 +40,11 @@ import {
 } from "karavan-core/lib/model/TopologyDefinition";
 import CustomGroup from "./CustomGroup";
 import CustomEdge from "./CustomEdge";
+import {IntegrationFile} from "./TopologyStore";
 
 const NODE_DIAMETER = 60;
 
-export function getIntegrations(files: ProjectFile[]): Integration[] {
+export function getIntegrations(files: IntegrationFile[]): Integration[] {
     return files.filter((file) => file.name.endsWith(".camel.yaml")).map((file) => {
         return CamelDefinitionYaml.yamlToIntegration(file.name, file.code);
     })
@@ -207,7 +207,7 @@ export function getInternalEdges(tons: TopologyOutgoingNode[], tins: TopologyInc
     return result;
 }
 
-export function getModel(files: ProjectFile[]): Model {
+export function getModel(files: IntegrationFile[]): Model {
     const integrations = getIntegrations(files);
     const tins = TopologyUtils.findTopologyIncomingNodes(integrations);
     const troutes = TopologyUtils.findTopologyRouteNodes(integrations);
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx b/karavan-designer/src/topology/TopologyPropertiesPanel.tsx
similarity index 81%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
copy to karavan-designer/src/topology/TopologyPropertiesPanel.tsx
index 48aabcd7..24deca24 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
+++ b/karavan-designer/src/topology/TopologyPropertiesPanel.tsx
@@ -15,23 +15,23 @@
  * limitations under the License.
  */
 import React from 'react';
-import '../../designer/karavan.css';
+import '../designer/karavan.css';
 import {shallow} from "zustand/shallow";
 import {TopologySideBar} from "@patternfly/react-topology";
 import {useTopologyStore} from "./TopologyStore";
-import {DslProperties} from "../../designer/route/DslProperties";
+import {DslProperties} from "../designer/route/DslProperties";
 import {Button, Flex, FlexItem, Text, Tooltip, TooltipPosition} from "@patternfly/react-core";
 import CloseIcon from "@patternfly/react-icons/dist/esm/icons/times-icon";
-import {useFilesStore, useFileStore} from "../../api/ProjectStore";
 
-export function TopologyPropertiesPanel () {
+interface Props {
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyPropertiesPanel (props: Props) {
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
-    const [files] = useFilesStore((s) => [s.files], shallow);
     const [selectedIds, setSelectedIds, fileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.fileName], shallow);
 
-
     function getHeader() {
         return (
             <Flex className="properties-header" direction={{default: "row"}} justifyContent={{default: "justifyContentFlexStart"}}>
@@ -41,10 +41,7 @@ export function TopologyPropertiesPanel () {
                 <FlexItem>
                     <Button variant="link" onClick={event => {
                         if (fileName) {
-                            const file = files.filter(f => f.name === fileName)?.at(0);
-                            if (file) {
-                                setFile('select', file);
-                            }
+                            props.onSetFile(fileName);
                         }
                     }}
                     >{fileName}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts b/karavan-designer/src/topology/TopologyStore.ts
similarity index 89%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
copy to karavan-designer/src/topology/TopologyStore.ts
index 750d1e16..5bbdf124 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
+++ b/karavan-designer/src/topology/TopologyStore.ts
@@ -18,6 +18,16 @@
 import {createWithEqualityFn} from "zustand/traditional";
 import {shallow} from "zustand/shallow";
 
+export class IntegrationFile {
+    name: string = '';
+    code: string = '';
+
+    constructor(name: string, code: string) {
+        this.name = name;
+        this.code = code;
+    }
+}
+
 interface TopologyState {
     selectedIds: string []
     fileName?: string
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx b/karavan-designer/src/topology/TopologyTab.tsx
similarity index 88%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
copy to karavan-designer/src/topology/TopologyTab.tsx
index 22e9dbc4..df48e0c0 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
+++ b/karavan-designer/src/topology/TopologyTab.tsx
@@ -30,16 +30,21 @@ import {
     SELECTION_EVENT, Model,
 } from '@patternfly/react-topology';
 import {customComponentFactory, getModel} from "./TopologyApi";
-import {useFilesStore} from "../../api/ProjectStore";
 import {shallow} from "zustand/shallow";
-import {useTopologyStore} from "./TopologyStore";
+import {IntegrationFile, useTopologyStore} from "./TopologyStore";
 import {TopologyPropertiesPanel} from "./TopologyPropertiesPanel";
 import {TopologyToolbar} from "./TopologyToolbar";
-import {useDesignerStore} from "../../designer/DesignerStore";
+import {useDesignerStore} from "../designer/DesignerStore";
 
-export const TopologyTab: React.FC = () => {
 
-    const [files] = useFilesStore((s) => [s.files], shallow);
+interface Props {
+    files: IntegrationFile[],
+    onClickCreateButton: () => void
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyTab (props: Props) {
+
     const [selectedIds, setSelectedIds, setFileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.setFileName], shallow);
     const [setSelectedStep] = useDesignerStore((s) => [s.setSelectedStep], shallow)
@@ -62,7 +67,7 @@ export const TopologyTab: React.FC = () => {
     }
 
     const controller = React.useMemo(() => {
-        const model = getModel(files);
+        const model = getModel(props.files);
         const newController = new Visualization();
         newController.registerLayoutFactory((_, graph) => new DagreLayout(graph));
         newController.registerComponentFactory(customComponentFactory);
@@ -81,15 +86,15 @@ export const TopologyTab: React.FC = () => {
 
     React.useEffect(() => {
         setSelectedIds([])
-        const model = getModel(files);
+        const model = getModel(props.files);
         controller.fromModel(model, false);
     }, []);
 
     return (
         <TopologyView
             className="topology-panel"
-            contextToolbar={<TopologyToolbar/>}
-            sideBar={<TopologyPropertiesPanel/>}
+            contextToolbar={<TopologyToolbar onClickCreateButton={props.onClickCreateButton}/>}
+            sideBar={<TopologyPropertiesPanel onSetFile={props.onSetFile}/>}
             controlBar={
                 <TopologyControlBar
                     controlButtons={createTopologyControlButtons({
@@ -117,4 +122,4 @@ export const TopologyTab: React.FC = () => {
             </VisualizationProvider>
         </TopologyView>
     );
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx b/karavan-designer/src/topology/TopologyToolbar.tsx
similarity index 78%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
copy to karavan-designer/src/topology/TopologyToolbar.tsx
index f77abafe..2d9fc55c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
+++ b/karavan-designer/src/topology/TopologyToolbar.tsx
@@ -20,14 +20,13 @@ import {
     Button,
     ToolbarItem, Tooltip
 } from '@patternfly/react-core';
-import { useFileStore} from "../../api/ProjectStore";
-import {shallow} from "zustand/shallow";
 import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
-import {CreateFileModal} from "../files/CreateFileModal";
 
-export const TopologyToolbar: React.FC = () => {
+interface Props {
+    onClickCreateButton: () => void
+}
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
+export function TopologyToolbar (props: Props) {
 
     return (
         <ToolbarItem align={{default: "alignRight"}}>
@@ -35,12 +34,11 @@ export const TopologyToolbar: React.FC = () => {
                 <Button size="sm"
                         variant={"primary"}
                         icon={<PlusIcon/>}
-                        onClick={e => setFile("create")}
+                        onClick={e => props.onClickCreateButton()}
                 >
                     Create
                 </Button>
             </Tooltip>
-            <CreateFileModal types={['INTEGRATION']}/>
         </ToolbarItem>
     )
 }
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css b/karavan-designer/src/topology/topology.css
similarity index 100%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css
copy to karavan-designer/src/topology/topology.css
diff --git a/karavan-space/package-lock.json b/karavan-space/package-lock.json
index d496d57c..8c70eb79 100644
--- a/karavan-space/package-lock.json
+++ b/karavan-space/package-lock.json
@@ -9,25 +9,26 @@
       "version": "4.0.1",
       "license": "Apache-2.0",
       "dependencies": {
-        "@monaco-editor/react": "4.5.0",
-        "@patternfly/patternfly": "^5.0.2",
-        "@patternfly/react-core": "^5.0.0",
-        "@patternfly/react-table": "^5.0.0",
+        "@monaco-editor/react": "4.6.0",
+        "@patternfly/patternfly": "^5.1.0",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-table": "^5.1.1",
+        "@patternfly/react-topology": "^5.1.0",
         "@types/js-yaml": "4.0.5",
         "@types/node": "18.15.3",
-        "@types/uuid": "9.0.1",
-        "axios": "1.4.0",
+        "@types/uuid": "9.0.5",
+        "axios": "1.5.1",
         "dagre": "0.8.5",
         "html-to-image": "1.11.11",
         "karavan-core": "file:../karavan-core",
         "netlify-auth-providers": "^1.0.0-alpha5",
-        "octokit": "^2.0.10",
+        "octokit": "^3.1.1",
         "react": "18.2.0",
         "react-dom": "18.2.0",
         "react-scripts": "5.0.1",
         "rxjs": "7.8.1",
-        "uuid": "9.0.0",
-        "zustand": "^4.4.1"
+        "uuid": "9.0.1",
+        "zustand": "^4.4.3"
       },
       "devDependencies": {
         "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
@@ -1970,9 +1971,9 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz",
-      "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+      "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
       "dependencies": {
         "@babel/code-frame": "^7.22.13",
         "@babel/generator": "^7.23.0",
@@ -3138,9 +3139,9 @@
       "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
     },
     "node_modules/@monaco-editor/loader": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.3.tgz",
-      "integrity": "sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz",
+      "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==",
       "dependencies": {
         "state-local": "^1.0.6"
       },
@@ -3149,11 +3150,11 @@
       }
     },
     "node_modules/@monaco-editor/react": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.5.0.tgz",
-      "integrity": "sha512-VJMkp5Fe1+w8pLEq8tZPHZKu8zDXQIA1FtiDTSNccg1D3wg1YIZaH2es2Qpvop1k62g3c/YySRb3bnGXu2XwYQ==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz",
+      "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==",
       "dependencies": {
-        "@monaco-editor/loader": "^1.3.3"
+        "@monaco-editor/loader": "^1.4.0"
       },
       "peerDependencies": {
         "monaco-editor": ">= 0.25.0 < 1",
@@ -3202,356 +3203,365 @@
       }
     },
     "node_modules/@octokit/app": {
-      "version": "13.1.8",
-      "resolved": "https://registry.npmjs.org/@octokit/app/-/app-13.1.8.tgz",
-      "integrity": "sha512-bCncePMguVyFpdBbnceFKfmPOuUD94T189GuQ0l00ZcQ+mX4hyPqnaWJlsXE2HSdA71eV7p8GPDZ+ErplTkzow==",
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/app/-/app-14.0.1.tgz",
+      "integrity": "sha512-4opdXcWBVhzd6FOxlaxDKXXqi9Vz2hsDSWQGNo49HbYFAX11UqMpksMjEdfvHy0x19Pse8Nvn+R6inNb/V398w==",
       "dependencies": {
-        "@octokit/auth-app": "^4.0.13",
-        "@octokit/auth-unauthenticated": "^3.0.0",
-        "@octokit/core": "^4.0.0",
-        "@octokit/oauth-app": "^4.0.7",
-        "@octokit/plugin-paginate-rest": "^6.0.0",
-        "@octokit/types": "^9.0.0",
-        "@octokit/webhooks": "^10.0.0"
+        "@octokit/auth-app": "^6.0.0",
+        "@octokit/auth-unauthenticated": "^5.0.0",
+        "@octokit/core": "^5.0.0",
+        "@octokit/oauth-app": "^6.0.0",
+        "@octokit/plugin-paginate-rest": "^9.0.0",
+        "@octokit/types": "^12.0.0",
+        "@octokit/webhooks": "^12.0.1"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-app": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-4.0.13.tgz",
-      "integrity": "sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==",
-      "dependencies": {
-        "@octokit/auth-oauth-app": "^5.0.0",
-        "@octokit/auth-oauth-user": "^2.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.1.tgz",
+      "integrity": "sha512-tjCD4nzQNZgmLH62+PSnTF6eGerisFgV4v6euhqJik6yWV96e1ZiiGj+NXIqbgnpjLmtnBqVUrNyGKu3DoGEGA==",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^7.0.0",
+        "@octokit/auth-oauth-user": "^4.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0",
         "deprecation": "^2.3.1",
-        "lru-cache": "^9.0.0",
+        "lru-cache": "^10.0.0",
         "universal-github-app-jwt": "^1.1.1",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-app/node_modules/lru-cache": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz",
-      "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
+      "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
       "engines": {
         "node": "14 || >=16.14"
       }
     },
     "node_modules/@octokit/auth-oauth-app": {
-      "version": "5.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.6.tgz",
-      "integrity": "sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw==",
-      "dependencies": {
-        "@octokit/auth-oauth-device": "^4.0.0",
-        "@octokit/auth-oauth-user": "^2.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.1.tgz",
+      "integrity": "sha512-RE0KK0DCjCHXHlQBoubwlLijXEKfhMhKm9gO56xYvFmP1QTMb+vvwRPmQLLx0V+5AvV9N9I3lr1WyTzwL3rMDg==",
+      "dependencies": {
+        "@octokit/auth-oauth-device": "^6.0.0",
+        "@octokit/auth-oauth-user": "^4.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/types": "^12.0.0",
         "@types/btoa-lite": "^1.0.0",
         "btoa-lite": "^1.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-oauth-device": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz",
-      "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.1.tgz",
+      "integrity": "sha512-yxU0rkL65QkjbqQedgVx3gmW7YM5fF+r5uaSj9tM/cQGVqloXcqP2xK90eTyYvl29arFVCW8Vz4H/t47mL0ELw==",
       "dependencies": {
-        "@octokit/oauth-methods": "^2.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/oauth-methods": "^4.0.0",
+        "@octokit/request": "^8.0.0",
+        "@octokit/types": "^12.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-oauth-user": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz",
-      "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.1.tgz",
+      "integrity": "sha512-N94wWW09d0hleCnrO5wt5MxekatqEJ4zf+1vSe8MKMrhZ7gAXKFOKrDEZW2INltvBWJCyDUELgGRv8gfErH1Iw==",
       "dependencies": {
-        "@octokit/auth-oauth-device": "^4.0.0",
-        "@octokit/oauth-methods": "^2.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/auth-oauth-device": "^6.0.0",
+        "@octokit/oauth-methods": "^4.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/types": "^12.0.0",
         "btoa-lite": "^1.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-token": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
-      "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
+      "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/auth-unauthenticated": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-3.0.5.tgz",
-      "integrity": "sha512-yH2GPFcjrTvDWPwJWWCh0tPPtTL5SMgivgKPA+6v/XmYN6hGQkAto8JtZibSKOpf8ipmeYhLNWQ2UgW0GYILCw==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz",
+      "integrity": "sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==",
       "dependencies": {
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0"
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/core": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
-      "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
-      "dependencies": {
-        "@octokit/auth-token": "^3.0.0",
-        "@octokit/graphql": "^5.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz",
+      "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==",
+      "dependencies": {
+        "@octokit/auth-token": "^4.0.0",
+        "@octokit/graphql": "^7.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0",
         "before-after-hook": "^2.2.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/endpoint": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
-      "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.1.tgz",
+      "integrity": "sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^12.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql": {
-      "version": "5.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz",
-      "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==",
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz",
+      "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==",
       "dependencies": {
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/request": "^8.0.1",
+        "@octokit/types": "^12.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/oauth-app": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-4.2.4.tgz",
-      "integrity": "sha512-iuOVFrmm5ZKNavRtYu5bZTtmlKLc5uVgpqTfMEqYYf2OkieV6VdxKZAb5qLVdEPL8LU2lMWcGpavPBV835cgoA==",
-      "dependencies": {
-        "@octokit/auth-oauth-app": "^5.0.0",
-        "@octokit/auth-oauth-user": "^2.0.0",
-        "@octokit/auth-unauthenticated": "^3.0.0",
-        "@octokit/core": "^4.0.0",
-        "@octokit/oauth-authorization-url": "^5.0.0",
-        "@octokit/oauth-methods": "^2.0.0",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-6.0.0.tgz",
+      "integrity": "sha512-bNMkS+vJ6oz2hCyraT9ZfTpAQ8dZNqJJQVNaKjPLx4ue5RZiFdU1YWXguOPR8AaSHS+lKe+lR3abn2siGd+zow==",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^7.0.0",
+        "@octokit/auth-oauth-user": "^4.0.0",
+        "@octokit/auth-unauthenticated": "^5.0.0",
+        "@octokit/core": "^5.0.0",
+        "@octokit/oauth-authorization-url": "^6.0.2",
+        "@octokit/oauth-methods": "^4.0.0",
         "@types/aws-lambda": "^8.10.83",
-        "fromentries": "^1.3.1",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/oauth-authorization-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz",
-      "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz",
+      "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/oauth-methods": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz",
-      "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.0.0.tgz",
+      "integrity": "sha512-dqy7BZLfLbi3/8X8xPKUKZclMEK9vN3fK5WF3ortRvtplQTszFvdAGbTo71gGLO+4ZxspNiLjnqdd64Chklf7w==",
       "dependencies": {
-        "@octokit/oauth-authorization-url": "^5.0.0",
-        "@octokit/request": "^6.2.3",
-        "@octokit/request-error": "^3.0.3",
-        "@octokit/types": "^9.0.0",
+        "@octokit/oauth-authorization-url": "^6.0.2",
+        "@octokit/request": "^8.0.2",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.0.0",
         "btoa-lite": "^1.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
-    "node_modules/@octokit/openapi-types": {
+    "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": {
       "version": "18.1.1",
       "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
       "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="
     },
-    "node_modules/@octokit/plugin-paginate-rest": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz",
-      "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==",
+    "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
+      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
       "dependencies": {
-        "@octokit/tsconfig": "^1.0.2",
-        "@octokit/types": "^9.2.3"
-      },
+        "@octokit/openapi-types": "^18.0.0"
+      }
+    },
+    "node_modules/@octokit/openapi-types": {
+      "version": "19.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz",
+      "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw=="
+    },
+    "node_modules/@octokit/plugin-paginate-graphql": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.0.tgz",
+      "integrity": "sha512-7HcYW5tP7/Z6AETAPU14gp5H5KmCPT3hmJrS/5tO7HIgbwenYmgw4OY9Ma54FDySuxMwD+wsJlxtuGWwuZuItA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=4"
+        "@octokit/core": ">=5"
       }
     },
-    "node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz",
-      "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==",
+    "node_modules/@octokit/plugin-paginate-rest": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz",
+      "integrity": "sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw==",
       "dependencies": {
-        "@octokit/types": "^10.0.0"
+        "@octokit/types": "^12.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=3"
+        "@octokit/core": ">=5"
       }
     },
-    "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz",
-      "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==",
+    "node_modules/@octokit/plugin-rest-endpoint-methods": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.0.1.tgz",
+      "integrity": "sha512-fgS6HPkPvJiz8CCliewLyym9qAx0RZ/LKh3sATaPfM41y/O2wQ4Z9MrdYeGPVh04wYmHFmWiGlKPC7jWVtZXQA==",
       "dependencies": {
-        "@octokit/openapi-types": "^18.0.0"
+        "@octokit/types": "^12.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=5"
       }
     },
     "node_modules/@octokit/plugin-retry": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz",
-      "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz",
+      "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0",
         "bottleneck": "^2.15.3"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=3"
+        "@octokit/core": ">=5"
       }
     },
     "node_modules/@octokit/plugin-throttling": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz",
-      "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.0.0.tgz",
+      "integrity": "sha512-OkMbHYUidj81q92YRkPzWmwXkEtsI3KOcSkNm763aqUOh9IEplyX05XjKAdZFANAvaYH0Q4JBZwu4h2VnPVXZA==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^12.0.0",
         "bottleneck": "^2.15.3"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": "^4.0.0"
+        "@octokit/core": "^5.0.0"
       }
     },
     "node_modules/@octokit/request": {
-      "version": "6.2.8",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
-      "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+      "version": "8.1.4",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz",
+      "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==",
       "dependencies": {
-        "@octokit/endpoint": "^7.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/endpoint": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0",
         "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/request-error": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
-      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz",
+      "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^12.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
-    "node_modules/@octokit/tsconfig": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz",
-      "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA=="
-    },
     "node_modules/@octokit/types": {
-      "version": "9.3.2",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
-      "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz",
+      "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==",
       "dependencies": {
-        "@octokit/openapi-types": "^18.0.0"
+        "@octokit/openapi-types": "^19.0.0"
       }
     },
     "node_modules/@octokit/webhooks": {
-      "version": "10.9.1",
-      "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-10.9.1.tgz",
-      "integrity": "sha512-5NXU4VfsNOo2VSU/SrLrpPH2Z1ZVDOWFcET4EpnEBX1uh/v8Uz65UVuHIRx5TZiXhnWyRE9AO1PXHa+M/iWwZA==",
+      "version": "12.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.0.3.tgz",
+      "integrity": "sha512-8iG+/yza7hwz1RrQ7i7uGpK2/tuItZxZq1aTmeg2TNp2xTUB8F8lZF/FcZvyyAxT8tpDMF74TjFGCDACkf1kAQ==",
       "dependencies": {
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/webhooks-methods": "^3.0.0",
-        "@octokit/webhooks-types": "6.11.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/webhooks-methods": "^4.0.0",
+        "@octokit/webhooks-types": "7.1.0",
         "aggregate-error": "^3.1.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/webhooks-methods": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-3.0.3.tgz",
-      "integrity": "sha512-2vM+DCNTJ5vL62O5LagMru6XnYhV4fJslK+5YUkTa6rWlW2S+Tqs1lF9Wr9OGqHfVwpBj3TeztWfVON/eUoW1Q==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-4.0.0.tgz",
+      "integrity": "sha512-M8mwmTXp+VeolOS/kfRvsDdW+IO0qJ8kYodM/sAysk093q6ApgmBXwK1ZlUvAwXVrp/YVHp6aArj4auAxUAOFw==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/webhooks-types": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-6.11.0.tgz",
-      "integrity": "sha512-AanzbulOHljrku1NGfafxdpTCfw2ENaWzH01N2vqQM+cUFbk868Cgh0xylz0JIM9BoKbfI++bdD6EYX0Q/UTEw=="
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.1.0.tgz",
+      "integrity": "sha512-y92CpG4kFFtBBjni8LHoV12IegJ+KFxLgKRengrVjKmGE5XMeCuGvlfRe75lTRrgXaG6XIWJlFpIDTlkoJsU8w=="
     },
     "node_modules/@patternfly/patternfly": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.4.tgz",
-      "integrity": "sha512-8akdWzFpG384Q6Es8lzkfuhAlzVGrNK7TJqXGecHDAg8u1JsYn3+Nw6gLRviI88z8Kjxmg5YKirILjpclGxkIA=="
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.1.0.tgz",
+      "integrity": "sha512-wzVgL/0xPsmuRKWc6lMNEo5gDcTUtyU231eJSBTapOKXiwBOv2flvLEHPYLO6oDYXO+hwUrVgbcZFWMd1UlLwA=="
     },
     "node_modules/@patternfly/react-core": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.1.tgz",
-      "integrity": "sha512-Eevd+8ACLFV733J+cpo4FRgNtRBObIgmUcrqLjf9H99jZ1hFpBgacFyHiALFi2cuoNVGmdEzskFl+4c7Uo0n+w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.1.1.tgz",
+      "integrity": "sha512-9DbgQMXYmF8A4aCNLKXwIN1H07SIPoPaVLvx+yiDuJfDx4Qi0T+H7j5cx0VfDfxuCpqea3POJWqBQn1HnwS4wQ==",
       "dependencies": {
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
-        "focus-trap": "7.4.3",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
+        "focus-trap": "7.5.2",
         "react-dropzone": "^14.2.3",
         "tslib": "^2.5.0"
       },
@@ -3561,28 +3571,28 @@
       }
     },
     "node_modules/@patternfly/react-icons": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.1.tgz",
-      "integrity": "sha512-MduetDRzve3eRlKAioM/UxmVuPyFccdeBWAKhbN4SBn7RaZWS7kO7/xZzNkpeT5pqQIeAACvz3uiV2/3uAf38w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.1.1.tgz",
+      "integrity": "sha512-9gCxkWz2xcdi0rtXu2F0L68w4tLIlsgGTACo1ggr4aVng9jRX++o1PlCOqscOd9o0NiFnFD7BLlZUGvJWaYEZg==",
       "peerDependencies": {
         "react": "^17 || ^18",
         "react-dom": "^17 || ^18"
       }
     },
     "node_modules/@patternfly/react-styles": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.1.tgz",
-      "integrity": "sha512-kHP/lbvmhBnNfWiqJJLNwOQZnkcl6wfwAesRp22s4Lj941EWe0oFIqn925/uORIOAOz2du1121t7T4UTfLZg4w=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.1.1.tgz",
+      "integrity": "sha512-swO9X+WixYYDsMVsEJp1V8QUfhEQY91QfFm4phfYP4jc2TQ2opIFYdUIHkc+yrZwBhrgb/pPUUfemyqAoSbZcA=="
     },
     "node_modules/@patternfly/react-table": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.1.tgz",
-      "integrity": "sha512-2YbM6XvgG9ubJE4caPQKPMFBkcf7zYzLUFbHnkyfInpWeVNBs/+ZDAP2wnIHce7uaPLnJ1t0FVzGwaD/UuPwkg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.1.1.tgz",
+      "integrity": "sha512-9tAtHj16hemJ6YRBWIm2O+QRNoFWYQt8ZLQ1G0KBwpg2t2G2CbGsS2RG+BamO4IVE6IPo3Yoo39p4UCNRiGVpA==",
       "dependencies": {
-        "@patternfly/react-core": "^5.0.1",
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
         "lodash": "^4.17.19",
         "tslib": "^2.5.0"
       },
@@ -3592,9 +3602,51 @@
       }
     },
     "node_modules/@patternfly/react-tokens": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.1.tgz",
-      "integrity": "sha512-YafAGJYvxDP4GaQ0vMybalWmx7MJ+etUf1cGoaMh0wRD2eswltT/RckygtEBKR/M61qXbgG+CxKmMyY8leoiDw=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.1.1.tgz",
+      "integrity": "sha512-cHuNkzNA9IY9aDwfjSEkitQoVEvRhOJRKhH0yIRlRByEkbdoV9jJZ9xj20hNShE+bxmNuom+MCTQSkpkN1bV8A=="
+    },
+    "node_modules/@patternfly/react-topology": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-5.1.0.tgz",
+      "integrity": "sha512-Qzu7GMxqCsRvQj4RF2AHOGSp0nPpVuDE2xpdAaj/yCKz0cqHhvrwpC4+qyVL3mlqIs5qb+Fxm2d81Do7YIx3ig==",
+      "dependencies": {
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@types/d3": "^7.4.0",
+        "@types/d3-force": "^1.2.1",
+        "@types/dagre": "0.7.42",
+        "@types/react-measure": "^2.0.6",
+        "d3": "^7.8.0",
+        "dagre": "0.8.2",
+        "lodash": "^4.17.19",
+        "mobx": "^6.9.0",
+        "mobx-react": "^7.6.0",
+        "point-in-svg-path": "^1.0.1",
+        "popper.js": "^1.16.1",
+        "react-measure": "^2.3.0",
+        "tslib": "^2.0.0",
+        "webcola": "3.4.0"
+      },
+      "peerDependencies": {
+        "react": "^17 || ^18",
+        "react-dom": "^17 || ^18"
+      }
+    },
+    "node_modules/@patternfly/react-topology/node_modules/@types/dagre": {
+      "version": "0.7.42",
+      "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.42.tgz",
+      "integrity": "sha512-knVdi1Ul8xYgJ0wdhQ+/2YGJFKJFa/5srcPII9zvOs4KhsHfpnFrSTQXATYmjslglxRMif3Lg+wEZ0beag+94A=="
+    },
+    "node_modules/@patternfly/react-topology/node_modules/dagre": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.2.tgz",
+      "integrity": "sha512-TEOOGZOkCOgCG7AoUIq64sJ3d21SMv8tyoqteLpX+UsUsS9Qw8iap4hhogXY4oB3r0bbZuAjO0atAilgCmsE0Q==",
+      "dependencies": {
+        "graphlib": "^2.1.5",
+        "lodash": "^4.17.4"
+      }
     },
     "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
       "version": "0.5.11",
@@ -4012,9 +4064,9 @@
       }
     },
     "node_modules/@types/aws-lambda": {
-      "version": "8.10.122",
-      "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz",
-      "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw=="
+      "version": "8.10.124",
+      "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.124.tgz",
+      "integrity": "sha512-PHqK0SuAkFS3tZjceqRXecxxrWIN3VqTicuialtK2wZmvBy7H9WGc3u3+wOgaZB7N8SpSXDpWk9qa7eorpTStg=="
     },
     "node_modules/@types/babel__core": {
       "version": "7.20.2",
@@ -4092,6 +4144,228 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/d3": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.1.tgz",
+      "integrity": "sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA==",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "node_modules/@types/d3-array": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.8.tgz",
+      "integrity": "sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ=="
+    },
+    "node_modules/@types/d3-axis": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.4.tgz",
+      "integrity": "sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-brush": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.4.tgz",
+      "integrity": "sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-chord": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.4.tgz",
+      "integrity": "sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg=="
+    },
+    "node_modules/@types/d3-color": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.1.tgz",
+      "integrity": "sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg=="
+    },
+    "node_modules/@types/d3-contour": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.4.tgz",
+      "integrity": "sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-delaunay": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
+      "integrity": "sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A=="
+    },
+    "node_modules/@types/d3-dispatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz",
+      "integrity": "sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw=="
+    },
+    "node_modules/@types/d3-drag": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.4.tgz",
+      "integrity": "sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-dsv": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.4.tgz",
+      "integrity": "sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA=="
+    },
+    "node_modules/@types/d3-ease": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz",
+      "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA=="
+    },
+    "node_modules/@types/d3-fetch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.4.tgz",
+      "integrity": "sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==",
+      "dependencies": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "node_modules/@types/d3-force": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.5.tgz",
+      "integrity": "sha512-1TB2IqtkPXsr7zUgPORayl2xsl28X4WMwlpaw2BLKTQpJ5ePO1t6TkM4spbTwoqc6dWipVTwg0gdOVrbzGQPNQ=="
+    },
+    "node_modules/@types/d3-format": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.2.tgz",
+      "integrity": "sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA=="
+    },
+    "node_modules/@types/d3-geo": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.5.tgz",
+      "integrity": "sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==",
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-hierarchy": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz",
+      "integrity": "sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ=="
+    },
+    "node_modules/@types/d3-interpolate": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz",
+      "integrity": "sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==",
+      "dependencies": {
+        "@types/d3-color": "*"
+      }
+    },
+    "node_modules/@types/d3-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz",
+      "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg=="
+    },
+    "node_modules/@types/d3-polygon": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz",
+      "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw=="
+    },
+    "node_modules/@types/d3-quadtree": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz",
+      "integrity": "sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg=="
+    },
+    "node_modules/@types/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ=="
+    },
+    "node_modules/@types/d3-scale": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.5.tgz",
+      "integrity": "sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==",
+      "dependencies": {
+        "@types/d3-time": "*"
+      }
+    },
+    "node_modules/@types/d3-scale-chromatic": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
+      "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw=="
+    },
+    "node_modules/@types/d3-selection": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.7.tgz",
+      "integrity": "sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg=="
+    },
+    "node_modules/@types/d3-shape": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.3.tgz",
+      "integrity": "sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==",
+      "dependencies": {
+        "@types/d3-path": "*"
+      }
+    },
+    "node_modules/@types/d3-time": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.1.tgz",
+      "integrity": "sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA=="
+    },
+    "node_modules/@types/d3-time-format": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.1.tgz",
+      "integrity": "sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q=="
+    },
+    "node_modules/@types/d3-timer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz",
+      "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g=="
+    },
+    "node_modules/@types/d3-transition": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.5.tgz",
+      "integrity": "sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-zoom": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.5.tgz",
+      "integrity": "sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==",
+      "dependencies": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
     "node_modules/@types/dagre": {
       "version": "0.7.50",
       "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.50.tgz",
@@ -4143,6 +4417,11 @@
         "@types/send": "*"
       }
     },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.11",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz",
+      "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg=="
+    },
     "node_modules/@types/graceful-fs": {
       "version": "4.1.7",
       "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz",
@@ -4242,8 +4521,7 @@
     "node_modules/@types/prop-types": {
       "version": "15.7.7",
       "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz",
-      "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==",
-      "devOptional": true
+      "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog=="
     },
     "node_modules/@types/qs": {
       "version": "6.9.8",
@@ -4259,7 +4537,6 @@
       "version": "18.2.23",
       "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.23.tgz",
       "integrity": "sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==",
-      "devOptional": true,
       "dependencies": {
         "@types/prop-types": "*",
         "@types/scheduler": "*",
@@ -4275,6 +4552,14 @@
         "@types/react": "*"
       }
     },
+    "node_modules/@types/react-measure": {
+      "version": "2.0.9",
+      "resolved": "https://registry.npmjs.org/@types/react-measure/-/react-measure-2.0.9.tgz",
+      "integrity": "sha512-8h9n24GK9Ckg1IxDjZLIjUu7/LDNVx2NbQd6KoD9R0JRy8B4ipA5OGCpsYhB6VULc4KlhsINKYUjd8+Urecq1A==",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
     "node_modules/@types/resolve": {
       "version": "1.17.1",
       "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@@ -4291,8 +4576,7 @@
     "node_modules/@types/scheduler": {
       "version": "0.16.4",
       "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz",
-      "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==",
-      "devOptional": true
+      "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ=="
     },
     "node_modules/@types/semver": {
       "version": "7.5.3",
@@ -4345,9 +4629,9 @@
       "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ=="
     },
     "node_modules/@types/uuid": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz",
-      "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA=="
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.5.tgz",
+      "integrity": "sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ=="
     },
     "node_modules/@types/ws": {
       "version": "8.5.6",
@@ -5279,9 +5563,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
-      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -6548,138 +6832,515 @@
         "cssesc": "bin/cssesc"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssnano": {
+      "version": "5.1.15",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+      "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+      "dependencies": {
+        "cssnano-preset-default": "^5.2.14",
+        "lilconfig": "^2.0.3",
+        "yaml": "^1.10.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/cssnano"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.15"
+      }
+    },
+    "node_modules/cssnano-preset-default": {
+      "version": "5.2.14",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+      "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+      "dependencies": {
+        "css-declaration-sorter": "^6.3.1",
+        "cssnano-utils": "^3.1.0",
+        "postcss-calc": "^8.2.3",
+        "postcss-colormin": "^5.3.1",
+        "postcss-convert-values": "^5.1.3",
+        "postcss-discard-comments": "^5.1.2",
+        "postcss-discard-duplicates": "^5.1.0",
+        "postcss-discard-empty": "^5.1.1",
+        "postcss-discard-overridden": "^5.1.0",
+        "postcss-merge-longhand": "^5.1.7",
+        "postcss-merge-rules": "^5.1.4",
+        "postcss-minify-font-values": "^5.1.0",
+        "postcss-minify-gradients": "^5.1.1",
+        "postcss-minify-params": "^5.1.4",
+        "postcss-minify-selectors": "^5.2.1",
+        "postcss-normalize-charset": "^5.1.0",
+        "postcss-normalize-display-values": "^5.1.0",
+        "postcss-normalize-positions": "^5.1.1",
+        "postcss-normalize-repeat-style": "^5.1.1",
+        "postcss-normalize-string": "^5.1.0",
+        "postcss-normalize-timing-functions": "^5.1.0",
+        "postcss-normalize-unicode": "^5.1.1",
+        "postcss-normalize-url": "^5.1.0",
+        "postcss-normalize-whitespace": "^5.1.1",
+        "postcss-ordered-values": "^5.1.3",
+        "postcss-reduce-initial": "^5.1.2",
+        "postcss-reduce-transforms": "^5.1.0",
+        "postcss-svgo": "^5.1.0",
+        "postcss-unique-selectors": "^5.1.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.15"
+      }
+    },
+    "node_modules/cssnano-utils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+      "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+      "engines": {
+        "node": "^10 || ^12 || >=14.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.15"
+      }
+    },
+    "node_modules/csso": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+      "dependencies": {
+        "css-tree": "~2.2.0"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/css-tree": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+      "dependencies": {
+        "mdn-data": "2.0.28",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/mdn-data": {
+      "version": "2.0.28",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
+    },
+    "node_modules/cssom": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+    },
+    "node_modules/cssstyle": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "dependencies": {
+        "cssom": "~0.3.6"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cssstyle/node_modules/cssom": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+    },
+    "node_modules/csstype": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+    },
+    "node_modules/d3": {
+      "version": "7.8.5",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
+      "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==",
+      "dependencies": {
+        "d3-array": "3",
+        "d3-axis": "3",
+        "d3-brush": "3",
+        "d3-chord": "3",
+        "d3-color": "3",
+        "d3-contour": "4",
+        "d3-delaunay": "6",
+        "d3-dispatch": "3",
+        "d3-drag": "3",
+        "d3-dsv": "3",
+        "d3-ease": "3",
+        "d3-fetch": "3",
+        "d3-force": "3",
+        "d3-format": "3",
+        "d3-geo": "3",
+        "d3-hierarchy": "3",
+        "d3-interpolate": "3",
+        "d3-path": "3",
+        "d3-polygon": "3",
+        "d3-quadtree": "3",
+        "d3-random": "3",
+        "d3-scale": "4",
+        "d3-scale-chromatic": "3",
+        "d3-selection": "3",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-array": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+      "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+      "dependencies": {
+        "internmap": "1 - 2"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "dependencies": {
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-contour": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+      "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+      "dependencies": {
+        "d3-array": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-delaunay": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+      "dependencies": {
+        "delaunator": "5"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+      "dependencies": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "bin": {
+        "csv2json": "bin/dsv2json.js",
+        "csv2tsv": "bin/dsv2dsv.js",
+        "dsv2dsv": "bin/dsv2dsv.js",
+        "dsv2json": "bin/dsv2json.js",
+        "json2csv": "bin/json2dsv.js",
+        "json2dsv": "bin/json2dsv.js",
+        "json2tsv": "bin/json2dsv.js",
+        "tsv2csv": "bin/dsv2dsv.js",
+        "tsv2json": "bin/dsv2json.js"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+      "dependencies": {
+        "d3-dsv": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-force": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-format": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz",
+      "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==",
+      "dependencies": {
+        "d3-array": "2.5.0 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-hierarchy": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+      "dependencies": {
+        "d3-color": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-path": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+      "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-quadtree": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano": {
-      "version": "5.1.15",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
-      "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+    "node_modules/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
       "dependencies": {
-        "cssnano-preset-default": "^5.2.14",
-        "lilconfig": "^2.0.3",
-        "yaml": "^1.10.2"
+        "d3-array": "2.10.0 - 3",
+        "d3-format": "1 - 3",
+        "d3-interpolate": "1.2.0 - 3",
+        "d3-time": "2.1.1 - 3",
+        "d3-time-format": "2 - 4"
       },
       "engines": {
-        "node": "^10 || ^12 || >=14.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/cssnano"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.15"
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano-preset-default": {
-      "version": "5.2.14",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
-      "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+    "node_modules/d3-scale-chromatic": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
+      "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
       "dependencies": {
-        "css-declaration-sorter": "^6.3.1",
-        "cssnano-utils": "^3.1.0",
-        "postcss-calc": "^8.2.3",
-        "postcss-colormin": "^5.3.1",
-        "postcss-convert-values": "^5.1.3",
-        "postcss-discard-comments": "^5.1.2",
-        "postcss-discard-duplicates": "^5.1.0",
-        "postcss-discard-empty": "^5.1.1",
-        "postcss-discard-overridden": "^5.1.0",
-        "postcss-merge-longhand": "^5.1.7",
-        "postcss-merge-rules": "^5.1.4",
-        "postcss-minify-font-values": "^5.1.0",
-        "postcss-minify-gradients": "^5.1.1",
-        "postcss-minify-params": "^5.1.4",
-        "postcss-minify-selectors": "^5.2.1",
-        "postcss-normalize-charset": "^5.1.0",
-        "postcss-normalize-display-values": "^5.1.0",
-        "postcss-normalize-positions": "^5.1.1",
-        "postcss-normalize-repeat-style": "^5.1.1",
-        "postcss-normalize-string": "^5.1.0",
-        "postcss-normalize-timing-functions": "^5.1.0",
-        "postcss-normalize-unicode": "^5.1.1",
-        "postcss-normalize-url": "^5.1.0",
-        "postcss-normalize-whitespace": "^5.1.1",
-        "postcss-ordered-values": "^5.1.3",
-        "postcss-reduce-initial": "^5.1.2",
-        "postcss-reduce-transforms": "^5.1.0",
-        "postcss-svgo": "^5.1.0",
-        "postcss-unique-selectors": "^5.1.1"
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
       },
       "engines": {
-        "node": "^10 || ^12 || >=14.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.15"
+        "node": ">=12"
       }
     },
-    "node_modules/cssnano-utils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
-      "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
       "engines": {
-        "node": "^10 || ^12 || >=14.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.2.15"
+        "node": ">=12"
       }
     },
-    "node_modules/csso": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
-      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+    "node_modules/d3-shape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+      "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
       "dependencies": {
-        "css-tree": "~2.2.0"
+        "d3-path": "^3.1.0"
       },
       "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/csso/node_modules/css-tree": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
-      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+    "node_modules/d3-time": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+      "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
       "dependencies": {
-        "mdn-data": "2.0.28",
-        "source-map-js": "^1.0.1"
+        "d3-array": "2 - 3"
       },
       "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/csso/node_modules/mdn-data": {
-      "version": "2.0.28",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
-      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+      "dependencies": {
+        "d3-time": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "node_modules/cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+    "node_modules/d3-timer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "node_modules/cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
       "dependencies": {
-        "cssom": "~0.3.6"
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
       }
     },
-    "node_modules/cssstyle/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
-    },
-    "node_modules/csstype": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
-      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
-      "devOptional": true
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/dagre": {
       "version": "0.8.5",
@@ -6819,6 +7480,14 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/delaunator": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
+      "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==",
+      "dependencies": {
+        "robust-predicates": "^3.0.0"
+      }
+    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -8373,11 +9042,11 @@
       "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ=="
     },
     "node_modules/focus-trap": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz",
-      "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==",
+      "version": "7.5.2",
+      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz",
+      "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==",
       "dependencies": {
-        "tabbable": "^6.1.2"
+        "tabbable": "^6.2.0"
       }
     },
     "node_modules/follow-redirects": {
@@ -8634,25 +9303,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/fromentries": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
-      "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
     "node_modules/fs-extra": {
       "version": "10.1.0",
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -8749,6 +9399,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/get-node-dimensions": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz",
+      "integrity": "sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ=="
+    },
     "node_modules/get-own-enumerable-property-symbols": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -9419,6 +10074,14 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/internmap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/ipaddr.js": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
@@ -12701,6 +13364,60 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/mobx": {
+      "version": "6.10.2",
+      "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.10.2.tgz",
+      "integrity": "sha512-B1UGC3ieK3boCjnMEcZSwxqRDMdzX65H/8zOHbuTY8ZhvrIjTUoLRR2TP2bPqIgYRfb3+dUigu8yMZufNjn0LQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      }
+    },
+    "node_modules/mobx-react": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz",
+      "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==",
+      "dependencies": {
+        "mobx-react-lite": "^3.4.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      },
+      "peerDependencies": {
+        "mobx": "^6.1.0",
+        "react": "^16.8.0 || ^17 || ^18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mobx-react-lite": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz",
+      "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      },
+      "peerDependencies": {
+        "mobx": "^6.1.0",
+        "react": "^16.8.0 || ^17 || ^18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/monaco-editor": {
       "version": "0.38.0",
       "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.38.0.tgz",
@@ -12787,25 +13504,6 @@
         "tslib": "^2.0.3"
       }
     },
-    "node_modules/node-fetch": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/node-forge": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -13001,22 +13699,23 @@
       "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
     },
     "node_modules/octokit": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/octokit/-/octokit-2.1.0.tgz",
-      "integrity": "sha512-Pxi6uKTjBRZWgAwsw1NgHdRlL+QASCN35OYS7X79o7PtBME0CLXEroZmPtEwlWZbPTP+iDbEy2wCbSOgm0uGIQ==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.1.1.tgz",
+      "integrity": "sha512-AKJs5XYs7iAh7bskkYpxhUIpsYZdLqjnlnqrN5s9FFZuJ/a6ATUHivGpUKDpGB/xa+LGDtG9Lu8bOCfPM84vHQ==",
       "dependencies": {
-        "@octokit/app": "^13.1.5",
-        "@octokit/core": "^4.2.1",
-        "@octokit/oauth-app": "^4.2.1",
-        "@octokit/plugin-paginate-rest": "^6.1.0",
-        "@octokit/plugin-rest-endpoint-methods": "^7.1.1",
-        "@octokit/plugin-retry": "^4.1.3",
-        "@octokit/plugin-throttling": "^5.2.2",
-        "@octokit/request-error": "^v3.0.3",
-        "@octokit/types": "^9.2.2"
+        "@octokit/app": "^14.0.0",
+        "@octokit/core": "^5.0.0",
+        "@octokit/oauth-app": "^6.0.0",
+        "@octokit/plugin-paginate-graphql": "^4.0.0",
+        "@octokit/plugin-paginate-rest": "^9.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "^10.0.0",
+        "@octokit/plugin-retry": "^6.0.0",
+        "@octokit/plugin-throttling": "^8.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^12.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/on-finished": {
@@ -13404,10 +14103,28 @@
         "node": ">=4"
       }
     },
+    "node_modules/point-in-svg-path": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/point-in-svg-path/-/point-in-svg-path-1.0.2.tgz",
+      "integrity": "sha512-+Smsf7B9e7eRFHIwpN+4rE8inF2APbFWeywPfUgbeh02xdJSkbTz6Pqdt7A36wVCR+CnLbaNkRnBjgOpF5RMVQ==",
+      "engines": {
+        "node": ">=8.x.x"
+      }
+    },
+    "node_modules/popper.js": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+      "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
+      "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
     "node_modules/postcss": {
-      "version": "8.4.30",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz",
-      "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==",
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -15051,6 +15768,21 @@
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
       "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
     },
+    "node_modules/react-measure": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.5.2.tgz",
+      "integrity": "sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA==",
+      "dependencies": {
+        "@babel/runtime": "^7.2.0",
+        "get-node-dimensions": "^1.2.1",
+        "prop-types": "^15.6.2",
+        "resize-observer-polyfill": "^1.5.0"
+      },
+      "peerDependencies": {
+        "react": ">0.13.0",
+        "react-dom": ">0.13.0"
+      }
+    },
     "node_modules/react-refresh": {
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -15349,6 +16081,11 @@
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
+    "node_modules/resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "node_modules/resolve": {
       "version": "1.22.6",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
@@ -15492,6 +16229,11 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/robust-predicates": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
+      "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
+    },
     "node_modules/rollup": {
       "version": "2.79.1",
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
@@ -15583,6 +16325,11 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "node_modules/rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
+    },
     "node_modules/rxjs": {
       "version": "7.8.1",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
@@ -16845,11 +17592,6 @@
         "node": ">= 4.0.0"
       }
     },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
     "node_modules/tryer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
@@ -17215,9 +17957,13 @@
       }
     },
     "node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -17296,6 +18042,54 @@
         "minimalistic-assert": "^1.0.0"
       }
     },
+    "node_modules/webcola": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz",
+      "integrity": "sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==",
+      "dependencies": {
+        "d3-dispatch": "^1.0.3",
+        "d3-drag": "^1.0.4",
+        "d3-shape": "^1.3.5",
+        "d3-timer": "^1.0.5"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-dispatch": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
+      "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+    },
+    "node_modules/webcola/node_modules/d3-drag": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
+      "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
+      "dependencies": {
+        "d3-dispatch": "1",
+        "d3-selection": "1"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-path": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+    },
+    "node_modules/webcola/node_modules/d3-selection": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
+      "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
+    },
+    "node_modules/webcola/node_modules/d3-shape": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+      "dependencies": {
+        "d3-path": "1"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-timer": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
+      "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
+    },
     "node_modules/webidl-conversions": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
@@ -17641,20 +18435,6 @@
       "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
       "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
     },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/whatwg-url/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -18194,9 +18974,9 @@
       }
     },
     "node_modules/zustand": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.1.tgz",
-      "integrity": "sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==",
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.3.tgz",
+      "integrity": "sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==",
       "dependencies": {
         "use-sync-external-store": "1.2.0"
       },
diff --git a/karavan-space/package.json b/karavan-space/package.json
index cd98eba2..24dbc013 100644
--- a/karavan-space/package.json
+++ b/karavan-space/package.json
@@ -5,9 +5,10 @@
   "scripts": {
     "cp-designer": "cp -r ../karavan-designer/src/designer src",
     "cp-knowledgebase": "cp -r ../karavan-designer/src/knowledgebase src",
+    "cp-topology": "cp -r ../karavan-designer/src/topology src",
     "cp-public-kamelets": "cp -r ../karavan-designer/public/kamelets public",
     "cp-public-components": "cp -r ../karavan-designer/public/components public",
-    "copy": "npm run cp-designer && npm run cp-knowledgebase && npm run cp-public-components && npm run cp-public-kamelets",
+    "copy": "npm run cp-designer && npm run cp-knowledgebase && npm run cp-topology && npm run cp-public-components && npm run cp-public-kamelets",
     "start": "npm run copy && react-scripts start",
     "build": "npm run copy && react-scripts build",
     "prod": "npm run copy && react-scripts build --dest && rsync -a build/* ../resources/META-INF/resources"
@@ -31,25 +32,26 @@
     ]
   },
   "dependencies": {
-    "@monaco-editor/react": "4.5.0",
-    "@patternfly/patternfly": "^5.0.2",
-    "@patternfly/react-core": "^5.0.0",
-    "@patternfly/react-table": "^5.0.0",
+    "@monaco-editor/react": "4.6.0",
+    "@patternfly/patternfly": "^5.1.0",
+    "@patternfly/react-core": "^5.1.1",
+    "@patternfly/react-table": "^5.1.1",
+    "@patternfly/react-topology": "^5.1.0",
     "@types/js-yaml": "4.0.5",
     "@types/node": "18.15.3",
-    "@types/uuid": "9.0.1",
-    "axios": "1.4.0",
+    "@types/uuid": "9.0.5",
+    "axios": "1.5.1",
     "dagre": "0.8.5",
     "html-to-image": "1.11.11",
     "karavan-core": "file:../karavan-core",
     "netlify-auth-providers": "^1.0.0-alpha5",
-    "octokit": "^2.0.10",
+    "octokit": "^3.1.1",
     "react": "18.2.0",
     "react-dom": "18.2.0",
     "react-scripts": "5.0.1",
     "rxjs": "7.8.1",
-    "uuid": "9.0.0",
-    "zustand": "^4.4.1"
+    "uuid": "9.0.1",
+    "zustand": "^4.4.3"
   },
   "devDependencies": {
     "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
diff --git a/karavan-space/src/designer/route/DslElement.tsx b/karavan-space/src/designer/route/DslElement.tsx
index 0d246b20..305b7859 100644
--- a/karavan-space/src/designer/route/DslElement.tsx
+++ b/karavan-space/src/designer/route/DslElement.tsx
@@ -46,9 +46,9 @@ export function DslElement(props: Props) {
 
     const [integration] = useIntegrationStore((s) => [s.integration, s.setIntegration], shallow)
 
-    const [selectedUuids, setShowMoveConfirmation, hideLogDSL, setMoveElements] =
+    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, hideLogDSL, setMoveElements] =
         useDesignerStore((s) =>
-            [s.selectedUuids, s.setShowMoveConfirmation, s.hideLogDSL, s.setMoveElements], shallow)
+            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.hideLogDSL, s.setMoveElements], shallow)
     const [isDragging, setIsDragging] = useState<boolean>(false);
 
     const [isDraggedOver, setIsDraggedOver] = useState<boolean>(false);
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx b/karavan-space/src/topology/CustomEdge.tsx
similarity index 87%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
copy to karavan-space/src/topology/CustomEdge.tsx
index 0eb8e0eb..bd4fa92e 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
+++ b/karavan-space/src/topology/CustomEdge.tsx
@@ -18,12 +18,10 @@
 import * as React from 'react';
 
 import './topology.css';
-import {DefaultEdge, DefaultGroup, observer} from '@patternfly/react-topology';
+import {DefaultEdge, observer} from '@patternfly/react-topology';
 
 
 const CustomEdge: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
-
     return (
         <DefaultEdge element={element} {...rest}>
         </DefaultEdge>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx b/karavan-space/src/topology/CustomGroup.tsx
similarity index 94%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
copy to karavan-space/src/topology/CustomGroup.tsx
index 7df861ce..9e366c7c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
+++ b/karavan-space/src/topology/CustomGroup.tsx
@@ -22,7 +22,6 @@ import { DefaultGroup, observer} from '@patternfly/react-topology';
 
 
 const CustomGroup: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
 
     return (
         <DefaultGroup element={element} {...rest}>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx b/karavan-space/src/topology/CustomNode.tsx
similarity index 92%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
copy to karavan-space/src/topology/CustomNode.tsx
index 12492fdf..2d87457d 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
+++ b/karavan-space/src/topology/CustomNode.tsx
@@ -19,8 +19,8 @@ import * as React from 'react';
 import {RegionsIcon} from '@patternfly/react-icons';
 
 import {DefaultNode, observer} from '@patternfly/react-topology';
-import {getDesignerIcon} from "../../designer/utils/KaravanIcons";
-import {CamelUi} from "../../designer/utils/CamelUi";
+import {getDesignerIcon} from "../designer/utils/KaravanIcons";
+import {CamelUi} from "../designer/utils/CamelUi";
 import './topology.css';
 
 function getIcon(data: any) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx b/karavan-space/src/topology/TopologyApi.tsx
similarity index 97%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
copy to karavan-space/src/topology/TopologyApi.tsx
index d9ec3ba9..44ff57a2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
+++ b/karavan-space/src/topology/TopologyApi.tsx
@@ -29,7 +29,6 @@ import {
     withPanZoom, withSelection
 } from '@patternfly/react-topology';
 import CustomNode from "./CustomNode";
-import {ProjectFile} from "../../api/ProjectModels";
 import {Integration} from "karavan-core/lib/model/IntegrationDefinition";
 import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
 import {TopologyUtils} from "karavan-core/lib/api/TopologyUtils";
@@ -41,10 +40,11 @@ import {
 } from "karavan-core/lib/model/TopologyDefinition";
 import CustomGroup from "./CustomGroup";
 import CustomEdge from "./CustomEdge";
+import {IntegrationFile} from "./TopologyStore";
 
 const NODE_DIAMETER = 60;
 
-export function getIntegrations(files: ProjectFile[]): Integration[] {
+export function getIntegrations(files: IntegrationFile[]): Integration[] {
     return files.filter((file) => file.name.endsWith(".camel.yaml")).map((file) => {
         return CamelDefinitionYaml.yamlToIntegration(file.name, file.code);
     })
@@ -207,7 +207,7 @@ export function getInternalEdges(tons: TopologyOutgoingNode[], tins: TopologyInc
     return result;
 }
 
-export function getModel(files: ProjectFile[]): Model {
+export function getModel(files: IntegrationFile[]): Model {
     const integrations = getIntegrations(files);
     const tins = TopologyUtils.findTopologyIncomingNodes(integrations);
     const troutes = TopologyUtils.findTopologyRouteNodes(integrations);
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx b/karavan-space/src/topology/TopologyPropertiesPanel.tsx
similarity index 81%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
copy to karavan-space/src/topology/TopologyPropertiesPanel.tsx
index 48aabcd7..24deca24 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
+++ b/karavan-space/src/topology/TopologyPropertiesPanel.tsx
@@ -15,23 +15,23 @@
  * limitations under the License.
  */
 import React from 'react';
-import '../../designer/karavan.css';
+import '../designer/karavan.css';
 import {shallow} from "zustand/shallow";
 import {TopologySideBar} from "@patternfly/react-topology";
 import {useTopologyStore} from "./TopologyStore";
-import {DslProperties} from "../../designer/route/DslProperties";
+import {DslProperties} from "../designer/route/DslProperties";
 import {Button, Flex, FlexItem, Text, Tooltip, TooltipPosition} from "@patternfly/react-core";
 import CloseIcon from "@patternfly/react-icons/dist/esm/icons/times-icon";
-import {useFilesStore, useFileStore} from "../../api/ProjectStore";
 
-export function TopologyPropertiesPanel () {
+interface Props {
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyPropertiesPanel (props: Props) {
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
-    const [files] = useFilesStore((s) => [s.files], shallow);
     const [selectedIds, setSelectedIds, fileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.fileName], shallow);
 
-
     function getHeader() {
         return (
             <Flex className="properties-header" direction={{default: "row"}} justifyContent={{default: "justifyContentFlexStart"}}>
@@ -41,10 +41,7 @@ export function TopologyPropertiesPanel () {
                 <FlexItem>
                     <Button variant="link" onClick={event => {
                         if (fileName) {
-                            const file = files.filter(f => f.name === fileName)?.at(0);
-                            if (file) {
-                                setFile('select', file);
-                            }
+                            props.onSetFile(fileName);
                         }
                     }}
                     >{fileName}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts b/karavan-space/src/topology/TopologyStore.ts
similarity index 89%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
copy to karavan-space/src/topology/TopologyStore.ts
index 750d1e16..5bbdf124 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
+++ b/karavan-space/src/topology/TopologyStore.ts
@@ -18,6 +18,16 @@
 import {createWithEqualityFn} from "zustand/traditional";
 import {shallow} from "zustand/shallow";
 
+export class IntegrationFile {
+    name: string = '';
+    code: string = '';
+
+    constructor(name: string, code: string) {
+        this.name = name;
+        this.code = code;
+    }
+}
+
 interface TopologyState {
     selectedIds: string []
     fileName?: string
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx b/karavan-space/src/topology/TopologyTab.tsx
similarity index 88%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
copy to karavan-space/src/topology/TopologyTab.tsx
index 22e9dbc4..df48e0c0 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
+++ b/karavan-space/src/topology/TopologyTab.tsx
@@ -30,16 +30,21 @@ import {
     SELECTION_EVENT, Model,
 } from '@patternfly/react-topology';
 import {customComponentFactory, getModel} from "./TopologyApi";
-import {useFilesStore} from "../../api/ProjectStore";
 import {shallow} from "zustand/shallow";
-import {useTopologyStore} from "./TopologyStore";
+import {IntegrationFile, useTopologyStore} from "./TopologyStore";
 import {TopologyPropertiesPanel} from "./TopologyPropertiesPanel";
 import {TopologyToolbar} from "./TopologyToolbar";
-import {useDesignerStore} from "../../designer/DesignerStore";
+import {useDesignerStore} from "../designer/DesignerStore";
 
-export const TopologyTab: React.FC = () => {
 
-    const [files] = useFilesStore((s) => [s.files], shallow);
+interface Props {
+    files: IntegrationFile[],
+    onClickCreateButton: () => void
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyTab (props: Props) {
+
     const [selectedIds, setSelectedIds, setFileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.setFileName], shallow);
     const [setSelectedStep] = useDesignerStore((s) => [s.setSelectedStep], shallow)
@@ -62,7 +67,7 @@ export const TopologyTab: React.FC = () => {
     }
 
     const controller = React.useMemo(() => {
-        const model = getModel(files);
+        const model = getModel(props.files);
         const newController = new Visualization();
         newController.registerLayoutFactory((_, graph) => new DagreLayout(graph));
         newController.registerComponentFactory(customComponentFactory);
@@ -81,15 +86,15 @@ export const TopologyTab: React.FC = () => {
 
     React.useEffect(() => {
         setSelectedIds([])
-        const model = getModel(files);
+        const model = getModel(props.files);
         controller.fromModel(model, false);
     }, []);
 
     return (
         <TopologyView
             className="topology-panel"
-            contextToolbar={<TopologyToolbar/>}
-            sideBar={<TopologyPropertiesPanel/>}
+            contextToolbar={<TopologyToolbar onClickCreateButton={props.onClickCreateButton}/>}
+            sideBar={<TopologyPropertiesPanel onSetFile={props.onSetFile}/>}
             controlBar={
                 <TopologyControlBar
                     controlButtons={createTopologyControlButtons({
@@ -117,4 +122,4 @@ export const TopologyTab: React.FC = () => {
             </VisualizationProvider>
         </TopologyView>
     );
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx b/karavan-space/src/topology/TopologyToolbar.tsx
similarity index 78%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
copy to karavan-space/src/topology/TopologyToolbar.tsx
index f77abafe..2d9fc55c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
+++ b/karavan-space/src/topology/TopologyToolbar.tsx
@@ -20,14 +20,13 @@ import {
     Button,
     ToolbarItem, Tooltip
 } from '@patternfly/react-core';
-import { useFileStore} from "../../api/ProjectStore";
-import {shallow} from "zustand/shallow";
 import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
-import {CreateFileModal} from "../files/CreateFileModal";
 
-export const TopologyToolbar: React.FC = () => {
+interface Props {
+    onClickCreateButton: () => void
+}
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
+export function TopologyToolbar (props: Props) {
 
     return (
         <ToolbarItem align={{default: "alignRight"}}>
@@ -35,12 +34,11 @@ export const TopologyToolbar: React.FC = () => {
                 <Button size="sm"
                         variant={"primary"}
                         icon={<PlusIcon/>}
-                        onClick={e => setFile("create")}
+                        onClick={e => props.onClickCreateButton()}
                 >
                     Create
                 </Button>
             </Tooltip>
-            <CreateFileModal types={['INTEGRATION']}/>
         </ToolbarItem>
     )
 }
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css b/karavan-space/src/topology/topology.css
similarity index 100%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css
copy to karavan-space/src/topology/topology.css
diff --git a/karavan-web/karavan-app/src/main/webui/package-lock.json b/karavan-web/karavan-app/src/main/webui/package-lock.json
index be575612..bd5209d3 100644
--- a/karavan-web/karavan-app/src/main/webui/package-lock.json
+++ b/karavan-web/karavan-app/src/main/webui/package-lock.json
@@ -9,29 +9,29 @@
       "version": "4.0.1",
       "dependencies": {
         "@microsoft/fetch-event-source": "^2.0.1",
-        "@monaco-editor/react": "4.5.1",
-        "@patternfly/patternfly": "^5.0.2",
-        "@patternfly/react-charts": "^7.0.0",
-        "@patternfly/react-core": "^5.0.0",
+        "@monaco-editor/react": "4.6.0",
+        "@patternfly/patternfly": "^5.1.0",
+        "@patternfly/react-charts": "^7.1.1",
+        "@patternfly/react-core": "^5.1.1",
         "@patternfly/react-log-viewer": "^5.0.0",
-        "@patternfly/react-table": "^5.0.0",
-        "@patternfly/react-topology": "^5.0.0",
-        "@types/js-yaml": "4.0.5",
+        "@patternfly/react-table": "^5.1.1",
+        "@patternfly/react-topology": "^5.1.0",
+        "@types/js-yaml": "4.0.7",
         "@types/node": "18.16.3",
         "@types/uuid": "9.0.1",
-        "axios": "1.4.0",
+        "axios": "1.5.1",
         "buffer": "6.0.3",
         "dagre": "0.8.5",
         "file-saver": "2.0.5",
         "html-to-image": "1.11.11",
         "karavan-core": "file:../../../../../karavan-core",
-        "keycloak-js": "22.0.3",
+        "keycloak-js": "22.0.4",
         "react": "18.2.0",
         "react-dom": "18.2.0",
         "react-router-dom": "^6.15.0",
         "rxjs": "7.8.1",
-        "uuid": "9.0.0",
-        "zustand": "^4.4.1"
+        "uuid": "9.0.1",
+        "zustand": "^4.4.3"
       },
       "devDependencies": {
         "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
@@ -3368,9 +3368,9 @@
       "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
     },
     "node_modules/@monaco-editor/loader": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.3.tgz",
-      "integrity": "sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz",
+      "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==",
       "dependencies": {
         "state-local": "^1.0.6"
       },
@@ -3379,11 +3379,11 @@
       }
     },
     "node_modules/@monaco-editor/react": {
-      "version": "4.5.1",
-      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.5.1.tgz",
-      "integrity": "sha512-NNDFdP+2HojtNhCkRfE6/D6ro6pBNihaOzMbGK84lNWzRu+CfBjwzGt4jmnqimLuqp5yE5viHS2vi+QOAnD5FQ==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz",
+      "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==",
       "dependencies": {
-        "@monaco-editor/loader": "^1.3.3"
+        "@monaco-editor/loader": "^1.4.0"
       },
       "peerDependencies": {
         "monaco-editor": ">= 0.25.0 < 1",
@@ -3436,17 +3436,17 @@
       }
     },
     "node_modules/@patternfly/patternfly": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.0.4.tgz",
-      "integrity": "sha512-8akdWzFpG384Q6Es8lzkfuhAlzVGrNK7TJqXGecHDAg8u1JsYn3+Nw6gLRviI88z8Kjxmg5YKirILjpclGxkIA=="
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.1.0.tgz",
+      "integrity": "sha512-wzVgL/0xPsmuRKWc6lMNEo5gDcTUtyU231eJSBTapOKXiwBOv2flvLEHPYLO6oDYXO+hwUrVgbcZFWMd1UlLwA=="
     },
     "node_modules/@patternfly/react-charts": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.0.1.tgz",
-      "integrity": "sha512-CwzRWzQhsEuWDJaCA2k7DvCaEqX1hA6UteNlYU/9Oh7z4mfWIbE89DRdxBc1AFnWRZbbZQW9TXBU3IPe/qAdqQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.1.1.tgz",
+      "integrity": "sha512-X5T+wlbh+sNKIVScx3ykivu1+EIEcQvEdjv6vfyBlsBU8CzACgMRQff4buBL6um3Zv2kT4LPefd6zxoaerJdkg==",
       "dependencies": {
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
         "hoist-non-react-statics": "^3.3.0",
         "lodash": "^4.17.19",
         "tslib": "^2.5.0",
@@ -3474,14 +3474,14 @@
       }
     },
     "node_modules/@patternfly/react-core": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.0.1.tgz",
-      "integrity": "sha512-Eevd+8ACLFV733J+cpo4FRgNtRBObIgmUcrqLjf9H99jZ1hFpBgacFyHiALFi2cuoNVGmdEzskFl+4c7Uo0n+w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.1.1.tgz",
+      "integrity": "sha512-9DbgQMXYmF8A4aCNLKXwIN1H07SIPoPaVLvx+yiDuJfDx4Qi0T+H7j5cx0VfDfxuCpqea3POJWqBQn1HnwS4wQ==",
       "dependencies": {
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
-        "focus-trap": "7.4.3",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
+        "focus-trap": "7.5.2",
         "react-dropzone": "^14.2.3",
         "tslib": "^2.5.0"
       },
@@ -3491,9 +3491,9 @@
       }
     },
     "node_modules/@patternfly/react-icons": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.0.1.tgz",
-      "integrity": "sha512-MduetDRzve3eRlKAioM/UxmVuPyFccdeBWAKhbN4SBn7RaZWS7kO7/xZzNkpeT5pqQIeAACvz3uiV2/3uAf38w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.1.1.tgz",
+      "integrity": "sha512-9gCxkWz2xcdi0rtXu2F0L68w4tLIlsgGTACo1ggr4aVng9jRX++o1PlCOqscOd9o0NiFnFD7BLlZUGvJWaYEZg==",
       "peerDependencies": {
         "react": "^17 || ^18",
         "react-dom": "^17 || ^18"
@@ -3515,19 +3515,19 @@
       }
     },
     "node_modules/@patternfly/react-styles": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.0.1.tgz",
-      "integrity": "sha512-kHP/lbvmhBnNfWiqJJLNwOQZnkcl6wfwAesRp22s4Lj941EWe0oFIqn925/uORIOAOz2du1121t7T4UTfLZg4w=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.1.1.tgz",
+      "integrity": "sha512-swO9X+WixYYDsMVsEJp1V8QUfhEQY91QfFm4phfYP4jc2TQ2opIFYdUIHkc+yrZwBhrgb/pPUUfemyqAoSbZcA=="
     },
     "node_modules/@patternfly/react-table": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.0.1.tgz",
-      "integrity": "sha512-2YbM6XvgG9ubJE4caPQKPMFBkcf7zYzLUFbHnkyfInpWeVNBs/+ZDAP2wnIHce7uaPLnJ1t0FVzGwaD/UuPwkg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.1.1.tgz",
+      "integrity": "sha512-9tAtHj16hemJ6YRBWIm2O+QRNoFWYQt8ZLQ1G0KBwpg2t2G2CbGsS2RG+BamO4IVE6IPo3Yoo39p4UCNRiGVpA==",
       "dependencies": {
-        "@patternfly/react-core": "^5.0.1",
-        "@patternfly/react-icons": "^5.0.1",
-        "@patternfly/react-styles": "^5.0.1",
-        "@patternfly/react-tokens": "^5.0.1",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@patternfly/react-tokens": "^5.1.1",
         "lodash": "^4.17.19",
         "tslib": "^2.5.0"
       },
@@ -3537,18 +3537,18 @@
       }
     },
     "node_modules/@patternfly/react-tokens": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.0.1.tgz",
-      "integrity": "sha512-YafAGJYvxDP4GaQ0vMybalWmx7MJ+etUf1cGoaMh0wRD2eswltT/RckygtEBKR/M61qXbgG+CxKmMyY8leoiDw=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.1.1.tgz",
+      "integrity": "sha512-cHuNkzNA9IY9aDwfjSEkitQoVEvRhOJRKhH0yIRlRByEkbdoV9jJZ9xj20hNShE+bxmNuom+MCTQSkpkN1bV8A=="
     },
     "node_modules/@patternfly/react-topology": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-5.0.0.tgz",
-      "integrity": "sha512-DW1dXXff5X+5K3ZW8rn1eqSggGfq5My/BMMcyhO6ankgAxAA4uK96/DbWaUMmSxkeHDSF6tD5jTd/SiglQzR1A==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-topology/-/react-topology-5.1.0.tgz",
+      "integrity": "sha512-Qzu7GMxqCsRvQj4RF2AHOGSp0nPpVuDE2xpdAaj/yCKz0cqHhvrwpC4+qyVL3mlqIs5qb+Fxm2d81Do7YIx3ig==",
       "dependencies": {
-        "@patternfly/react-core": "^5.0.0",
-        "@patternfly/react-icons": "^5.0.0",
-        "@patternfly/react-styles": "^5.0.0",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
         "@types/d3": "^7.4.0",
         "@types/d3-force": "^1.2.1",
         "@types/dagre": "0.7.42",
@@ -4456,9 +4456,9 @@
       }
     },
     "node_modules/@types/js-yaml": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz",
-      "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA=="
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.7.tgz",
+      "integrity": "sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg=="
     },
     "node_modules/@types/json-schema": {
       "version": "7.0.13",
@@ -5619,9 +5619,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
-      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -9345,11 +9345,11 @@
       "dev": true
     },
     "node_modules/focus-trap": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.4.3.tgz",
-      "integrity": "sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==",
+      "version": "7.5.2",
+      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz",
+      "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==",
       "dependencies": {
-        "tabbable": "^6.1.2"
+        "tabbable": "^6.2.0"
       }
     },
     "node_modules/follow-redirects": {
@@ -13487,9 +13487,9 @@
       "link": true
     },
     "node_modules/keycloak-js": {
-      "version": "22.0.3",
-      "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-22.0.3.tgz",
-      "integrity": "sha512-QV96sDngWMlJ8Mq5l+A0BNuzZqJT+d8UM9vvGsPXFT+TDfPjXuFjtrpHH26X6YMY3JaCvH2mH9PXb3DGvEkuOw==",
+      "version": "22.0.4",
+      "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-22.0.4.tgz",
+      "integrity": "sha512-PLEQSkEtv+CBcrfnL8/IqKDrWMAHdehCWzohORg7+lR7xpBkQOwpOh82+U/PXE44i9ZEXdRsvcKE9e4dqFUErA==",
       "dependencies": {
         "base64-js": "^1.5.1",
         "js-sha256": "^0.9.0"
@@ -18894,9 +18894,13 @@
       }
     },
     "node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -20318,9 +20322,9 @@
       }
     },
     "node_modules/zustand": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.1.tgz",
-      "integrity": "sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==",
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.3.tgz",
+      "integrity": "sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==",
       "dependencies": {
         "use-sync-external-store": "1.2.0"
       },
diff --git a/karavan-web/karavan-app/src/main/webui/package.json b/karavan-web/karavan-app/src/main/webui/package.json
index 78bd5f04..91fb88d5 100644
--- a/karavan-web/karavan-app/src/main/webui/package.json
+++ b/karavan-web/karavan-app/src/main/webui/package.json
@@ -3,8 +3,11 @@
   "version": "4.0.1",
   "private": true,
   "scripts": {
-    "copy-designer": "cp -r ../../../../../karavan-designer/src/designer src && cp -r ../../../../../karavan-designer/src/knowledgebase src",
-    "start": "export PORT=3003 && npm run copy-designer && react-scripts start",
+    "copy-designer": "cp -r ../../../../../karavan-designer/src/designer src",
+    "copy-knowledgebase": "cp -r ../../../../../karavan-designer/src/knowledgebase src",
+    "copy-topology": "cp -r ../../../../../karavan-designer/src/topology src",
+    "copy-code": " npm run copy-designer &&  npm run copy-knowledgebase &&  npm run copy-topology",
+    "start": "export PORT=3003 && npm run copy-code && react-scripts start",
     "build": "npm run copy-designer && DISABLE_ESLINT_PLUGIN=true react-scripts build"
   },
   "proxy": "http://127.0.0.1:8080/",
@@ -27,29 +30,29 @@
   },
   "dependencies": {
     "@microsoft/fetch-event-source": "^2.0.1",
-    "@monaco-editor/react": "4.5.1",
-    "@patternfly/patternfly": "^5.0.2",
-    "@patternfly/react-charts": "^7.0.0",
-    "@patternfly/react-core": "^5.0.0",
+    "@monaco-editor/react": "4.6.0",
+    "@patternfly/patternfly": "^5.1.0",
+    "@patternfly/react-charts": "^7.1.1",
+    "@patternfly/react-core": "^5.1.1",
     "@patternfly/react-log-viewer": "^5.0.0",
-    "@patternfly/react-table": "^5.0.0",
-    "@patternfly/react-topology": "^5.0.0",
-    "@types/js-yaml": "4.0.5",
+    "@patternfly/react-table": "^5.1.1",
+    "@patternfly/react-topology": "^5.1.0",
+    "@types/js-yaml": "4.0.7",
     "@types/node": "18.16.3",
     "@types/uuid": "9.0.1",
-    "axios": "1.4.0",
+    "axios": "1.5.1",
     "buffer": "6.0.3",
     "dagre": "0.8.5",
     "file-saver": "2.0.5",
     "html-to-image": "1.11.11",
     "karavan-core": "file:../../../../../karavan-core",
-    "keycloak-js": "22.0.3",
+    "keycloak-js": "22.0.4",
     "react": "18.2.0",
     "react-dom": "18.2.0",
     "react-router-dom": "^6.15.0",
     "rxjs": "7.8.1",
-    "uuid": "9.0.0",
-    "zustand": "^4.4.1"
+    "uuid": "9.0.1",
+    "zustand": "^4.4.3"
   },
   "devDependencies": {
     "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslElement.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslElement.tsx
index 0d246b20..305b7859 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslElement.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslElement.tsx
@@ -46,9 +46,9 @@ export function DslElement(props: Props) {
 
     const [integration] = useIntegrationStore((s) => [s.integration, s.setIntegration], shallow)
 
-    const [selectedUuids, setShowMoveConfirmation, hideLogDSL, setMoveElements] =
+    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, hideLogDSL, setMoveElements] =
         useDesignerStore((s) =>
-            [s.selectedUuids, s.setShowMoveConfirmation, s.hideLogDSL, s.setMoveElements], shallow)
+            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.hideLogDSL, s.setMoveElements], shallow)
     const [isDragging, setIsDragging] = useState<boolean>(false);
 
     const [isDraggedOver, setIsDraggedOver] = useState<boolean>(false);
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx
index 422063df..577b400c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPanel.tsx
@@ -18,7 +18,7 @@
 import React, {useEffect} from 'react';
 import {
     Flex,
-    FlexItem, Tabs, Tab, PageSection, PageSectionVariants, Gallery
+    FlexItem, PageSection
 } from '@patternfly/react-core';
 import '../designer/karavan.css';
 import {FilesTab} from "./files/FilesTab";
@@ -29,11 +29,8 @@ import {ProjectBuildTab} from "./build/ProjectBuildTab";
 import {ProjectService} from "../api/ProjectService";
 import {shallow} from "zustand/shallow";
 import {ImagesPanel} from "./build/ImagesPanel";
-import {ContainerButtons} from "./container/ContainerButtons";
 import {ProjectContainerTab} from "./container/ProjectContainerTab";
-import {KameletModal} from "../knowledgebase/kamelets/KameletModal";
-import {KameletCard} from "../knowledgebase/kamelets/KameletCard";
-import {TopologyTab} from "./topology/TopologyTab";
+import {ProjectTopologyTab} from "./topology/ProjectTopologyTab";
 
 export function ProjectPanel() {
 
@@ -58,7 +55,7 @@ export function ProjectPanel() {
     const buildIn = isBuildIn();
     const isTopology = tab === 'topology';
     return isTopology
-        ? (<TopologyTab/>)
+        ? (<ProjectTopologyTab/>)
         : (<PageSection padding={{default: 'noPadding'}} className="scrollable-out">
             <PageSection isFilled padding={{default: 'noPadding'}} className="scrollable-in">
                 <Flex direction={{default: "column"}} spaceItems={{default: "spaceItemsNone"}}>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/topology/ProjectTopologyTab.tsx
similarity index 52%
copy from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
copy to karavan-web/karavan-app/src/main/webui/src/project/topology/ProjectTopologyTab.tsx
index f77abafe..9df98a40 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/topology/ProjectTopologyTab.tsx
@@ -16,31 +16,39 @@
  */
 
 import * as React from 'react';
-import {
-    Button,
-    ToolbarItem, Tooltip
-} from '@patternfly/react-core';
-import { useFileStore} from "../../api/ProjectStore";
+import {useFilesStore, useFileStore} from "../../api/ProjectStore";
 import {shallow} from "zustand/shallow";
-import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
+import {TopologyTab} from "../../topology/TopologyTab";
+import {useEffect} from "react";
+import {IntegrationFile} from "../../topology/TopologyStore";
 import {CreateFileModal} from "../files/CreateFileModal";
 
-export const TopologyToolbar: React.FC = () => {
+export const ProjectTopologyTab: React.FC = () => {
 
     const [setFile] = useFileStore((s) => [s.setFile], shallow);
+    const [files] = useFilesStore((s) => [s.files], shallow);
+
+    useEffect(() => {
+        // console.log(files.map(f => f.name));
+        // setFiles(files.map(f => new IntegrationFile(f.name, f.code)));
+    }, []);
+
+
+    function selectFile(fileName: string) {
+        const file = files.filter(f => f.name === fileName)?.at(0);
+        if (file) {
+            setFile('select', file);
+        }
+    }
 
     return (
-        <ToolbarItem align={{default: "alignRight"}}>
-            <Tooltip content={"Add new integration"}>
-                <Button size="sm"
-                        variant={"primary"}
-                        icon={<PlusIcon/>}
-                        onClick={e => setFile("create")}
-                >
-                    Create
-                </Button>
-            </Tooltip>
+        <>
+            <TopologyTab
+                files={files.map(f => new IntegrationFile(f.name, f.code))}
+                onClickCreateButton={() => setFile('create')}
+                onSetFile={(fileName) => selectFile(fileName)}
+            />
             <CreateFileModal types={['INTEGRATION']}/>
-        </ToolbarItem>
-    )
-}
\ No newline at end of file
+        </>
+    );
+};
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/CustomEdge.tsx
similarity index 87%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/CustomEdge.tsx
index 0eb8e0eb..bd4fa92e 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomEdge.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/CustomEdge.tsx
@@ -18,12 +18,10 @@
 import * as React from 'react';
 
 import './topology.css';
-import {DefaultEdge, DefaultGroup, observer} from '@patternfly/react-topology';
+import {DefaultEdge, observer} from '@patternfly/react-topology';
 
 
 const CustomEdge: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
-
     return (
         <DefaultEdge element={element} {...rest}>
         </DefaultEdge>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/CustomGroup.tsx
similarity index 94%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/CustomGroup.tsx
index 7df861ce..9e366c7c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomGroup.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/CustomGroup.tsx
@@ -22,7 +22,6 @@ import { DefaultGroup, observer} from '@patternfly/react-topology';
 
 
 const CustomGroup: React.FC<any> = observer(({ element, ...rest }) => {
-    const data = element.getData();
 
     return (
         <DefaultGroup element={element} {...rest}>
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/CustomNode.tsx
similarity index 92%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/CustomNode.tsx
index 12492fdf..2d87457d 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/CustomNode.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/CustomNode.tsx
@@ -19,8 +19,8 @@ import * as React from 'react';
 import {RegionsIcon} from '@patternfly/react-icons';
 
 import {DefaultNode, observer} from '@patternfly/react-topology';
-import {getDesignerIcon} from "../../designer/utils/KaravanIcons";
-import {CamelUi} from "../../designer/utils/CamelUi";
+import {getDesignerIcon} from "../designer/utils/KaravanIcons";
+import {CamelUi} from "../designer/utils/CamelUi";
 import './topology.css';
 
 function getIcon(data: any) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
similarity index 97%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
index d9ec3ba9..44ff57a2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyApi.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
@@ -29,7 +29,6 @@ import {
     withPanZoom, withSelection
 } from '@patternfly/react-topology';
 import CustomNode from "./CustomNode";
-import {ProjectFile} from "../../api/ProjectModels";
 import {Integration} from "karavan-core/lib/model/IntegrationDefinition";
 import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
 import {TopologyUtils} from "karavan-core/lib/api/TopologyUtils";
@@ -41,10 +40,11 @@ import {
 } from "karavan-core/lib/model/TopologyDefinition";
 import CustomGroup from "./CustomGroup";
 import CustomEdge from "./CustomEdge";
+import {IntegrationFile} from "./TopologyStore";
 
 const NODE_DIAMETER = 60;
 
-export function getIntegrations(files: ProjectFile[]): Integration[] {
+export function getIntegrations(files: IntegrationFile[]): Integration[] {
     return files.filter((file) => file.name.endsWith(".camel.yaml")).map((file) => {
         return CamelDefinitionYaml.yamlToIntegration(file.name, file.code);
     })
@@ -207,7 +207,7 @@ export function getInternalEdges(tons: TopologyOutgoingNode[], tins: TopologyInc
     return result;
 }
 
-export function getModel(files: ProjectFile[]): Model {
+export function getModel(files: IntegrationFile[]): Model {
     const integrations = getIntegrations(files);
     const tins = TopologyUtils.findTopologyIncomingNodes(integrations);
     const troutes = TopologyUtils.findTopologyRouteNodes(integrations);
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyPropertiesPanel.tsx
similarity index 81%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/TopologyPropertiesPanel.tsx
index 48aabcd7..24deca24 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyPropertiesPanel.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyPropertiesPanel.tsx
@@ -15,23 +15,23 @@
  * limitations under the License.
  */
 import React from 'react';
-import '../../designer/karavan.css';
+import '../designer/karavan.css';
 import {shallow} from "zustand/shallow";
 import {TopologySideBar} from "@patternfly/react-topology";
 import {useTopologyStore} from "./TopologyStore";
-import {DslProperties} from "../../designer/route/DslProperties";
+import {DslProperties} from "../designer/route/DslProperties";
 import {Button, Flex, FlexItem, Text, Tooltip, TooltipPosition} from "@patternfly/react-core";
 import CloseIcon from "@patternfly/react-icons/dist/esm/icons/times-icon";
-import {useFilesStore, useFileStore} from "../../api/ProjectStore";
 
-export function TopologyPropertiesPanel () {
+interface Props {
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyPropertiesPanel (props: Props) {
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
-    const [files] = useFilesStore((s) => [s.files], shallow);
     const [selectedIds, setSelectedIds, fileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.fileName], shallow);
 
-
     function getHeader() {
         return (
             <Flex className="properties-header" direction={{default: "row"}} justifyContent={{default: "justifyContentFlexStart"}}>
@@ -41,10 +41,7 @@ export function TopologyPropertiesPanel () {
                 <FlexItem>
                     <Button variant="link" onClick={event => {
                         if (fileName) {
-                            const file = files.filter(f => f.name === fileName)?.at(0);
-                            if (file) {
-                                setFile('select', file);
-                            }
+                            props.onSetFile(fileName);
                         }
                     }}
                     >{fileName}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyStore.ts
similarity index 89%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
rename to karavan-web/karavan-app/src/main/webui/src/topology/TopologyStore.ts
index 750d1e16..5bbdf124 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyStore.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyStore.ts
@@ -18,6 +18,16 @@
 import {createWithEqualityFn} from "zustand/traditional";
 import {shallow} from "zustand/shallow";
 
+export class IntegrationFile {
+    name: string = '';
+    code: string = '';
+
+    constructor(name: string, code: string) {
+        this.name = name;
+        this.code = code;
+    }
+}
+
 interface TopologyState {
     selectedIds: string []
     fileName?: string
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyTab.tsx
similarity index 88%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/TopologyTab.tsx
index 22e9dbc4..df48e0c0 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyTab.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyTab.tsx
@@ -30,16 +30,21 @@ import {
     SELECTION_EVENT, Model,
 } from '@patternfly/react-topology';
 import {customComponentFactory, getModel} from "./TopologyApi";
-import {useFilesStore} from "../../api/ProjectStore";
 import {shallow} from "zustand/shallow";
-import {useTopologyStore} from "./TopologyStore";
+import {IntegrationFile, useTopologyStore} from "./TopologyStore";
 import {TopologyPropertiesPanel} from "./TopologyPropertiesPanel";
 import {TopologyToolbar} from "./TopologyToolbar";
-import {useDesignerStore} from "../../designer/DesignerStore";
+import {useDesignerStore} from "../designer/DesignerStore";
 
-export const TopologyTab: React.FC = () => {
 
-    const [files] = useFilesStore((s) => [s.files], shallow);
+interface Props {
+    files: IntegrationFile[],
+    onClickCreateButton: () => void
+    onSetFile: (fileName: string) => void
+}
+
+export function TopologyTab (props: Props) {
+
     const [selectedIds, setSelectedIds, setFileName] = useTopologyStore((s) =>
         [s.selectedIds, s.setSelectedIds, s.setFileName], shallow);
     const [setSelectedStep] = useDesignerStore((s) => [s.setSelectedStep], shallow)
@@ -62,7 +67,7 @@ export const TopologyTab: React.FC = () => {
     }
 
     const controller = React.useMemo(() => {
-        const model = getModel(files);
+        const model = getModel(props.files);
         const newController = new Visualization();
         newController.registerLayoutFactory((_, graph) => new DagreLayout(graph));
         newController.registerComponentFactory(customComponentFactory);
@@ -81,15 +86,15 @@ export const TopologyTab: React.FC = () => {
 
     React.useEffect(() => {
         setSelectedIds([])
-        const model = getModel(files);
+        const model = getModel(props.files);
         controller.fromModel(model, false);
     }, []);
 
     return (
         <TopologyView
             className="topology-panel"
-            contextToolbar={<TopologyToolbar/>}
-            sideBar={<TopologyPropertiesPanel/>}
+            contextToolbar={<TopologyToolbar onClickCreateButton={props.onClickCreateButton}/>}
+            sideBar={<TopologyPropertiesPanel onSetFile={props.onSetFile}/>}
             controlBar={
                 <TopologyControlBar
                     controlButtons={createTopologyControlButtons({
@@ -117,4 +122,4 @@ export const TopologyTab: React.FC = () => {
             </VisualizationProvider>
         </TopologyView>
     );
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx
similarity index 78%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
rename to karavan-web/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx
index f77abafe..2d9fc55c 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/topology/TopologyToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/topology/TopologyToolbar.tsx
@@ -20,14 +20,13 @@ import {
     Button,
     ToolbarItem, Tooltip
 } from '@patternfly/react-core';
-import { useFileStore} from "../../api/ProjectStore";
-import {shallow} from "zustand/shallow";
 import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
-import {CreateFileModal} from "../files/CreateFileModal";
 
-export const TopologyToolbar: React.FC = () => {
+interface Props {
+    onClickCreateButton: () => void
+}
 
-    const [setFile] = useFileStore((s) => [s.setFile], shallow);
+export function TopologyToolbar (props: Props) {
 
     return (
         <ToolbarItem align={{default: "alignRight"}}>
@@ -35,12 +34,11 @@ export const TopologyToolbar: React.FC = () => {
                 <Button size="sm"
                         variant={"primary"}
                         icon={<PlusIcon/>}
-                        onClick={e => setFile("create")}
+                        onClick={e => props.onClickCreateButton()}
                 >
                     Create
                 </Button>
             </Tooltip>
-            <CreateFileModal types={['INTEGRATION']}/>
         </ToolbarItem>
     )
 }
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css b/karavan-web/karavan-app/src/main/webui/src/topology/topology.css
similarity index 100%
rename from karavan-web/karavan-app/src/main/webui/src/project/topology/topology.css
rename to karavan-web/karavan-app/src/main/webui/src/topology/topology.css